找回密码
 立即注册
Qt开源社区 门户 查看内容

QT软件开发-第五章 主窗体

2019-4-21 06:20| 发布者: admin| 查看: 1280| 评论: 0

摘要: 点击上方蓝字关注我们5.1 Qmenu菜单栏菜单栏将系统可以执行的命令以阶层的方式显示出来的一个界面。一般置于画面的最上方或者最下方,应用程序能使用的所有命令几乎全部都能放入。菜单栏实际是一种树型结构,为软件 ...


点击上方蓝字关注我们




5.1 Qmenu菜单栏


菜单栏将系统可以执行的命令以阶层的方式显示出来的一个界面。一般置于画面的最上方或者最下方,应用程序能使用的所有命令几乎全部都能放入。菜单栏实际是一种树型结构,为软件的大多数功能提供功能入口。点击以后,即可显示出菜单项。QT提供了Qmenu类进行创建菜单,QMenuBar创建菜单栏,上下文菜单栏可以设置快捷键或单击鼠标右键调用,可以异步或者同步弹出。

5.1.1 创建Qmenu菜单


#include <QMenuBar>

#include <QMenu>

QAction* action_open; //QAction可以同时出现在菜单和工具条上的抽象用户界面操作

QAction* action_compile;

QMenuBar* menuBar;  //创建一个横向菜单

menuBar = new QMenuBar(this);//创建菜单按钮

QMenu* menu_open = menuBar->addMenu(tr("&打开"));

QMenu* menu_compile = menuBar->addMenu(tr("&编辑"));

/*添加菜单按钮的选项*/

action_open=menu_open->addAction(tr("&新建文件或项目"));

action_open->setShortcut(QKeySequence(Qt::CTR+ Qt::Key_A)); //设置快捷键

action_open=menu_open->addAction(tr("&打开文件或项目"));

action_open->setShortcut(QKeySequence(Qt::CTR+ Qt::Key_B));

action_open=menu_open->addAction(tr("&保存"));

action_open->setShortcut(QKeySequence(Qt::CTR+ Qt::Key_C));

action_open=menu_open->addAction(tr("&另存为"));

action_open->setShortcut(QKeySequence(Qt::CTR+ Qt::Key_D));

action_open=menu_open->addAction(tr("&退出"));

action_open->setShortcut(QKeySequence(Qt::CTR+ Qt::Key_E));

action_compile=menu_compile->addAction(tr("&撤销"));

action_compile->setShortcut(QKeySequence(Qt::ALT + Qt::Key_A));

action_compile=menu_compile->addAction(tr("&重做"));

action_compile->setShortcut(QKeySequence(Qt::ALT + Qt::Key_B));

action_compile=menu_compile->addAction(tr("&全选"));

action_compile->setShortcut(QKeySequence(Qt::ALT + Qt::Key_C));

action_compile=menu_compile->addAction(tr("&复制"));

action_compile->setShortcut(QKeySequence(Qt::ALT + Qt::Key_D));

action_compile=menu_compile->addAction(tr("&剪切"));

action_compile->setShortcut(QKeySequence(Qt::ALT + Qt::Key_E));





图5-1-1 菜单栏效果图

5.1.2 Qmenu函数介绍


    1. 创建横向菜单栏

QMenuBar用于创建一个横向风格的菜单栏,返回QMenu对象。

QMenuBar* menuBar;

menuBar = new QMenuBar(this);//创建一个横向菜单

/*创建菜单按钮*/

QMenu* menu1 = menuBar->addMenu(tr("&打开"));

QMenu* menu2 = menuBar->addMenu(tr("&编辑"));

    2. 添加新的菜单功能选项

QAction *addAction(const QString &text);

QAction *addAction(const QIcon &icon, const QString &text);

QAction *addAction(const QString &text, const QObject *receiver, const char* member, const QKeySequence &shortcut = 0);

QAction *addAction(const QIcon &icon, const QString &text, const QObject *receiver, const char* member, const QKeySequence &shortcut = 0);

addAction函数是一个重载函数,支持添加纯文本,图标。添加成功后并返回QAction描述。

QKeySequence &shortcut = 0:设置快捷键

示例:添加文本和图标

QAction *actionNew = menu->addAction(QIcon(":/images/openfile.png"),tr("打开文件"));

    3. 修改菜单栏标题

QString title() const

void setTitle(const QString &title)

    4. 设置默认选项

void QMenu::setDefaultAction(QAction *act)

QAction *QMenu::defaultAction() const

该属性保存着默认菜单选择的选项。

    5. 设置菜单栏图标

QIcon icon() const;

void setIcon(const QIcon &icon);

    6. 添加下级菜单

QAction *addMenu(QMenu *menu);

QMenu *addMenu(const QString &title);

QMenu *addMenu(const QIcon &icon, const QString &title);

在菜单选项上添加下级菜单选项,并返回指向新菜单选项的对象。

示例:

QMenuBar* menuBar;  //创建一个横向菜单

menuBar = new QMenuBar(this);//创建菜单按钮

QMenu* menu_file = menuBar->addMenu(tr("&文件同步功能"));

QMenu* ftp_men=menu_open->addMenu("FTP服务器");

ftp_men->addAction("向FTP服务器上传");

ftp_men->addAction("从FTP服务器下载");



图5-1-2 菜单栏效果图

  • 下面是QMenu常用的一些信号

   1. aboutToHide信号:点击菜单标题触发(获得焦点)。

voidaboutToHide()

   2. aboutToShow()信号:与aboutToHide信号相反,菜单标题失去焦点时触发。

voidaboutToShow()

   3. hovered信号:高亮菜单选项时触发(鼠标光标停留在某个菜单选项上)。

voidhovered(QAction * action)

   4. triggered信号:选中一个菜单选项时触发。

voidtriggered(QAction * action)

示例:

//关联信号

connect(menu_1,SIGNAL(triggered(QAction *) ),this,SLOT(slots_qmenu(QAction *)));

//槽函数

void MainWindow::slots_qmenu(QAction * action)

{

    //action->text(); //获取当前按下选项的文本,可以判断是哪一个按钮按下了

    //action->menu() //可以访问子菜单

}

5.1.3 QAction类介绍


QAction类提供了抽象的用户界面action,Actions可以被添加到菜单和工具栏中,并且可以自动保持在菜单和工具栏中的同步,工具栏和菜单都与QAction息息相关。例如,如果用户在工具栏中按下了Bold按钮,那么菜单中的Bold选项就会自动被选中。

Actions可以作为独立的对象被创建,QAction可以包括一个图标,菜单文本,快捷键,状态文本,这些内容的绝大部分都可以在构造函数中设置。也可以通过setIcon(),setIconText(),setShortCut(),setStatusTip(),setWhatsThis和SetToolTip()等函数分别设置。对于菜单项,我们还可以通过setFont()单独为它们设置字体。

  • 创建菜单示例

本例子将Actions作为独立对象创建,然后再添加到QMenu中。与5.1.1小节创建菜单栏示例实现的效果一样。

/* 初始化File菜单 */

QMenu *fileMenu = new QMenu(tr("&文件"), this);

QAction *fileOpenAction = new QAction(tr("&Open"), this);

QAction *fileSaveAction = new QAction(tr("&Save"), this);

fileMenu->addAction(fileOpenAction);

fileMenu->addAction(fileSaveAction);

/* 初始化Edit菜单 */

QMenu *editMenu = new QMenu(tr("&编辑"));

QAction *editCopyAction = editMenu->addAction("&Copy");

QAction *editCutAction = editMenu->addAction("&Cut");

/* 将菜单添加到菜单栏上 */

QMenuBar *menuBar =new QMenuBar(this);

menuBar->addMenu(fileMenu);

menuBar->addMenu(editMenu);





图5-1-3 菜单栏效果图

  •  以下列出QAction常用的函数

    1. 设置选项图标与文本

QString text() const

void setText(const QString &text)

QIcon icon() const

void setIcon(const QIcon &icon)

使用示例:

QAction *fileOpenAction = new QAction(tr("&Open"), this);

fileOpenAction->setIcon(QIcon(":/image/filenew.png"));

QAction *fileSaveAction = new QAction(tr("&Save"), this);

fileSaveAction->setIcon(QIcon(":/image/filesave.png"));



图5-1-4 菜单栏添加图标效果图

    2. 隐藏选项

booisVisible() const

void setVisible(bool)

如果将该属性设置为false,选项将会处于不可见状态。

    3. 设置选项的可用性

booisEnabled() const

void setEnabled(bool)

当选项不可用时,会处于灰色状态。

    4. 设置字体

QFont font() const

void setFont(const QFont &font)

    5. 添加子菜单

void QAction::setMenu(QMenu *menu)

QMenu *QAction::menu() const

setMenu一般用来添加选项的子菜单。

添加子菜单示例:

/* 初始化File菜单 */

QMenu *fileMenu = new QMenu(tr("&文件"), this);

QAction *fileOpenAction = new QAction(tr("&Open"), this);

fileOpenAction->setIcon(QIcon(":/image/filenew.png"));

fileMenu->addAction(fileOpenAction);

/* 初始化子菜单 */

QMenu *editMenu = new QMenu;

QAction *editCopyAction = editMenu->addAction("&new");

QAction *editCutAction = editMenu->addAction("&file..");

fileOpenAction->setMenu(editMenu);

/* 将菜单添加到菜单栏上 */

QMenuBar *menuBar =new QMenuBar(this);

menuBar->addMenu(fileMenu);



图5-1-5 添加子菜单效果图

    6. 设置快捷键

QKeySequence shortcut() const

void setShortcut(const QKeySequence &shortcut)

设置快捷键示例:

fileOpenAction->setShortcut(QKeySequence(Qt::ALT + Qt::Key_A));



图5-1-6 添加子菜单效果图

  • QAction常用的信号为triggered信号,当用户点击选项时发出该信号。

[signal] void QAction::triggered(boochecked = false)

关联信号示例:

1) 初始化菜单栏

/* 初始化File菜单 */

QMenu *fileMenu = new QMenu(tr("&文件"), this);

QAction *fileOpenAction = new QAction(tr("&Open"), this);

fileOpenAction->setIcon(QIcon(":/image/filenew.png"));

fileOpenAction->setShortcut(QKeySequence(Qt::ALT + Qt::Key_A));

fileMenu->addAction(fileOpenAction); //向菜单中添加选项

//关联信号

connect(fileOpenAction,SIGNAL(triggered(bool)),this,SLOT(slots_qmenu(bool)));

/* 创建横向菜单栏,并将菜单添加到菜单栏上 */

QMenuBar *menuBar =new QMenuBar(this);

menuBar->addMenu(fileMenu);

2) 槽函数声明

#ifndef WIDGET_H

#define WIDGET_H

#include <QWidget>

namespace Ui {

class Widget;

}

class Widget : public QWidget

{

    Q_OBJECT

public:

    explicit Widget(QWidget *parent = 0);

    ~Widget();

public slots:

    void slots_qmenu(boochecked);

private:

    Ui::Widget *ui;

};

#endif // WIDGET_H

3) 槽函数处理

//菜单对应的槽函数

void Widget::slots_qmenu(boochecked)

{

    //处理代码

}

5.2 QMainWindow主窗口


QMainWindow类为应用程序提供了一个主要窗口。QMainWindow提供了构建用户应用程序界面的框架,它由Menu Bar(菜单栏)、ToolBars(工具栏)、Dock Widget(描接窗口)、CentraWidget(中心窗口)、Status Bar(状态栏)组成,如下图所示:



图5-2-1 Qmainwindow主窗口框架

QMainWindow主窗口有自己的布局管理器,不允许用户添加额外的布局管理器,只有中心窗口区域允许用户设置布局管理器。

5.2.1 添加菜单栏


QMainWindow自带了一个Menu Bar菜单栏,不需要额外再去创建,可以通过menuBar()函数获取菜单栏。

相关函数原型如下:

QMenuBar *QMainWindow::menuBar() const

void QMainWindow::setMenuBar(QMenuBar *menuBar)

创建项目时,基类需要选择为QMainWindow,以下是QMainWindow插入菜单栏示例代码:

/* 初始化File菜单 */

QMenu *fileMenu = new QMenu(tr("&文件"), this);

QAction *fileOpenAction = new QAction(tr("&Open"), this);

QAction *fileSaveAction = new QAction(tr("&Save"), this);

fileMenu->addAction(fileOpenAction);

fileMenu->addAction(fileSaveAction);

/* 初始化Edit菜单 */

QMenu *editMenu = new QMenu(tr("&编辑"));

QAction *editCopyAction = editMenu->addAction("&Copy");

QAction *editCutAction = editMenu->addAction("&Cut");

/* 将菜单添加到菜单栏上 */

QMenuBar *menuBar =this->menuBar(); //获取菜单栏

menuBar->addMenu(fileMenu);

menuBar->addMenu(editMenu);



图 5-2-2 菜单栏

  • 图形界面添加菜单方式






  • 编辑菜单栏选项方式







设置不同的图标:



5.2.2 添加工具栏


QT的QToolBar类提供了一个可移动工具面板,可以用来添加类似按钮效果的选项。工具栏一般位于菜单栏的下面,可以拖动停留在主窗口的上下左右四个方向。一个主窗口可以添加多个工具面板。

  • 向QMainWindow主窗口插入工具栏示例

/* 初始化File菜单 */

QMenu *fileMenu = new QMenu(tr("&文件"), this);

QAction *fileOpenAction = new QAction(tr("&Open"), this);

QAction *fileSaveAction = new QAction(tr("&Save"), this);

fileMenu->addAction(fileOpenAction);

fileMenu->addAction(fileSaveAction);

/* 初始化Edit菜单 */

QMenu *editMenu = new QMenu(tr("&编辑"));

QAction *editCopyAction = editMenu->addAction("&Copy");

QAction *editCutAction = editMenu->addAction("&Cut");

/* 将菜单添加到菜单栏上 */

QMenuBar *menuBar =this->menuBar(); //获取菜单栏

menuBar->addMenu(fileMenu);

menuBar->addMenu(editMenu);

/* 添加工具栏*/

QToolBar *fileToolBar = addToolBar(tr("File"));

fileToolBar->addAction(fileOpenAction);

fileToolBar->addAction(fileSaveAction);

QToolBar *editToolBar = addToolBar(tr("Edit"));

editToolBar->addAction(editCopyAction);

editToolBar->addAction(editCutAction);





图5-2-3 工具栏效果图


  • 图形方式添加工具栏






  • 以下QToolBar介绍常用的成员函数

QToolBar继承于QWidget,以下只介绍了QToolBar本身的一些函数。

    1. 向工具栏添加新的选项

void addAction(QAction *action);

QAction *QToolBar::addAction(const QString &text)

QAction *QToolBar::addAction(const QIcon &icon, const QString &text)

addAction函数支持直接添加QAction对象,也支持创建QAction对象,然后返回对象指针。

用法示例:

/*方式1*/

QToolBar *fileToolBar = addToolBar(tr("File"));

QAction *fileOpenAction = new QAction(tr("&Open"), this);

QAction *fileSaveAction = new QAction(tr("&Save"), this);

fileToolBar->addAction(fileOpenAction);

fileToolBar->addAction(fileSaveAction);

/*方式2*/

QToolBar *editToolBar = addToolBar(tr("Edit"));

editToolBar->addAction(QIcon(":/image/editcopy.png"),"copy");

editToolBar->addAction(QIcon(":/image/editcut.png"),"cut");

    2. 添加分隔符

QAction *QToolBar::addSeparator()



图5-2-4 添加分隔符效果图

    3. 设置按钮显示的样式

Qt::ToolButtonStyle toolButtonStyle() const

void setToolButtonStyle(Qt::ToolButtonStyle toolButtonStyle)

    4. 设置工具栏是否可以移动

booisMovable() const

void setMovable(boomovable)

如果工具栏的可移动属性发生改变,会发出movableChanged信号。

    5. 设置工具栏的水平与垂直方向

Qt::Orientation orientation() const

void setOrientation(Qt::Orientation orientation)

当工具栏的显示方向发生改变,会发出orientationChanged信号,该信号保存了当前工具栏的新方向。

   6. QToolBar常用的信号是ctionTriggered,当点击工具栏中的按钮时触发ctionTriggered信号。形参代表了按下的选项。

[signal] void QToolBar::actionTriggered(QAction *action)

示例:

/*创建工具栏,关联点击信号*/

QToolBar *editToolBar = addToolBar(tr("Edit"));

editToolBar->addAction(QIcon(":/image/editcopy.png"),"copy");

editToolBar->addAction(QIcon(":/image/editcut.png"),"cut");

connect(editToolBar,SIGNAL(actionTriggered(QAction *)),this,SLOT(slots_action(QAction *)));

...

/*槽函数处理代码*/

void MainWindow::slots_action(QAction *Action)

{

    if(Action->text()=="copy")

    {

        //copy功能代码

    }

    if(Action->text()=="cut")

    {

         //cut功能代码

    }

}

5.2.3 添加描接窗口与主窗口


描接窗口QDockWidget在QMinwindow中作为一个容器使用,一个主窗口可以包含多个QDockWidget描接窗口。QDockWidget类提供了一个特殊的窗口部件,它可以被锁在QMainWindow窗口内部或者是作为顶级窗口悬浮在桌面上。描接窗口锁在QMainWindow窗口内部时,可以像工具栏一样停留在主窗口的上、下、左、右4个位置。

QMainWindow提供了addDockWidget函数用来添加描接窗口,使用setCentralWidget函数设置主窗口。QMainWindow主窗口支持添加布局器。

  • QMainWindow添加描接窗口与主窗口的函数原型介绍

void addDockWidget(Qt::DockWidgetArea area, QDockWidget *dockwidget);  //添加描接窗口

void setCentralWidget(QWidget *widget); //添加主窗口

Qt::DockWidgetArea area描述了窗口摆放的位置。

Qt::LeftDockWidgetArea 

左对齐

Qt::RightDockWidgetArea

右对齐

Qt::TopDockWidgetArea  

顶部

Qt::BottomDockWidgetArea

底部

  • 下面创建一个QMainWindow项目,描述添加描接窗口与主窗口的步骤

打开 QtCreator,新建一个 Qt Widgets Application 项目(配套程序编号CH5-1),基类选择 QMainWindow,不创建ui界面文件,其他默认。

    1. mainwindow.cpp代码

#include "mainwindow.h"

#include <QMenuBar>

MainWindow::MainWindow(QWidget *parent)

  : QMainWindow(parent)

{

  /*1 初始化File菜单 */

  fileMenu = new QMenu(tr("&文件"), this);

  /*1.1 初始化file菜单*/

  fileOpenAction = new QAction(QIcon(":/image/filenew.png"),tr("&Open"), this);

  fileSaveAction = new QAction(QIcon(":/image/filesave.png"),tr("&Save"), this);

  fileMenu->addAction(fileOpenAction);

  fileMenu->addAction(fileSaveAction);

  /* 1.2 初始化Edit菜单 */

  editMenu = new QMenu(tr("&编辑"), this);

  editCopyAction = new QAction(QIcon(":/image/editcopy.png"),tr("©"), this);

  editCutAction = new QAction(QIcon(":/image/editcut.png"),tr("&cut"), this);

  editMenu->addAction(editCopyAction);

  editMenu->addAction(editCutAction);

  /* 1.3 创建菜单栏,并添加菜单选项*/

  menuBar=new QMenuBar;

  this->setMenuBar(menuBar);

  menuBar->addMenu(fileMenu);

  menuBar->addMenu(editMenu);

  /*1.4 关联槽函数*/

  connect(fileOpenAction,SIGNAL(triggered(bool)),this,SLOT(Open_qmenu(bool)));

  connect(fileSaveAction,SIGNAL(triggered(bool)),this,SLOT(Save_qmenu(bool)));

  connect(editCopyAction,SIGNAL(triggered(bool)),this,SLOT(Copy_qmenu(bool)));

  connect(editCutAction,SIGNAL(triggered(bool)),this,SLOT(Cut_qmenu(bool)));

  /*2 添加工具栏*/

  /*2.1 添加file工具栏*/

  fileToolBar = this->addToolBar(tr("File"));

  fileToolBar->addAction(fileOpenAction);

  fileToolBar->addAction(fileSaveAction);

  /*2.2 添加Edit工具栏*/

  editToolBar = this->addToolBar(tr("Edit"));

  editToolBar->addAction(editCopyAction);

  editToolBar->addAction(editCutAction);

  /*3 添加描接窗口*/

  QWidget *Dockwindow = new QWidget;

  QLineEdit *nameLineEdit=new QLineEdit;

  QLineEdit *emailLineEdit=new QLineEdit;

  QSpinBox *ageSpinBox=new QSpinBox;

  QFormLayout *formLayout = new QFormLayout;

  formLayout->addRow(tr("&姓名:"), nameLineEdit);

  formLayout->addRow(tr("&邮箱:"), emailLineEdit);

  formLayout->addRow(tr("&姓名:"), ageSpinBox);

  Dockwindow->setLayout(formLayout);

  dockWidget = new QDockWidget(tr("描接窗口展示"), this);

  dockWidget->setAllowedAreas(Qt::AllDockWidgetAreas);

  dockWidget->setWidget(Dockwindow);

  addDockWidget(Qt::LeftDockWidgetArea, dockWidget);

  /*4 添加主窗口*/

  widget =new QWidget(this);

  edit=new QTextEdit;

  hboxlayout=new QHBoxLayout;

  hboxlayout->addWidget(edit);

  widget->setLayout(hboxlayout);

  setCentralWidget(widget);

}

MainWindow::~MainWindow()

{

   /*编写释放代码*/

}

void MainWindow::Open_qmenu(boochecked)

{

  QMessageBox::information(this,"消息提示","open选项被按下",QMessageBox::Ok);

}

void MainWindow::Save_qmenu(boochecked)

{

  QMessageBox::information(this,"消息提示","Save选项被按下",QMessageBox::Ok);

}

void MainWindow::Copy_qmenu(boochecked)

{

  QMessageBox::information(this,"消息提示","Copy选项被按下",QMessageBox::Ok);

}

void MainWindow::Cut_qmenu(boochecked)

{

  QMessageBox::information(this,"消息提示","Cut选项被按下",QMessageBox::Ok);

}

    2. mainwindow.h代码

#ifndef MAINWINDOW_H

#define MAINWINDOW_H

#include <QMainWindow>

#include <QMenu>

#include <QAction>

#include <QToolBar>

#include <QDebug>

#include <QDockWidget>

#include <QHBoxLayout>

#include <QPushButton>

#include <QTextEdit>

#include <QSpinBox>

#include <QFormLayout>

#include <QLineEdit>

#include <QMenuBar>

#include <QMessageBox>

class MainWindow : public QMainWindow

{

  Q_OBJECT

public:

  MainWindow(QWidget *parent = 0);

  ~MainWindow();

  /*菜单栏相关*/

   QMenu *fileMenu;

   QAction *fileOpenAction;

   QAction *fileSaveAction;

   QMenu *editMenu;

   QAction *editCopyAction;

   QAction *editCutAction;

   QMenuBar *menuBar;

   /*工具栏相关*/

   QToolBar *fileToolBar;

   QToolBar *editToolBar;

   /*描接窗口与主窗口*/

   QDockWidget *dockWidget;

   QWidget *widget;

   QTextEdit *edit;

   QHBoxLayout *hboxlayout;

public slots:

   void Open_qmenu(boochecked);

   void Save_qmenu(boochecked);

   void Copy_qmenu(boochecked);

   void Cut_qmenu(boochecked);

};#endif // MAINWINDOW_H

    3. 运行效果






 

图5-2-5 描接窗口效果图展示

  • 以下介绍QDockWidget常用的成员函数

    1. 设置QDockWidget窗口作为独立窗口浮动到桌面上

booisFloating() const

void setFloating(boofloating)

    2. 设置窗口属性

DockWidgetFeatures features() const

void setFeatures(DockWidgetFeatures features)

支持的属性如下:

QDockWidget::DockWidgetClosable

显示关闭按钮

QDockWidget::DockWidgetMovable

可以移动

QDockWidget::DockWidgetFloatable

可以脱离主窗口浮动显示

QDockWidget::NoDockWidgetFeatures

不能关,不能移动,不能浮动

QDockWidget::AllDockWidgetFeatures

支持浮动,支持关闭,支持移动

QDockWidget::DockWidgetVerticalTitleBar

标题栏垂直显示在主窗口左侧

    3. 还原关闭的窗口

void setVisible(boovisible);

如果点击了QDockWidget窗口的关闭按钮,可以使用setVisible函数还原之前的显示。

5.2.4 添加状态栏


状态栏是位于主窗口的最下方,提供一个显示工具提示等信息的地方。QT提供了QStatusBar类来实现状态栏。QMainWindow类里面有一个statusBar()函数,用于实现状态栏的调用。statusBar()函数类似于menuBar()函数,如果不存在状态栏,该函数会自动创建一个,如果已经创建则会返回这个状态栏的指针。如果要替换掉已经存在的状态栏,需要使用QMainWindow的setStatusBar()函数。

在Qt里面,状态栏显示的信息有三种类型:临时信息、一般信息和永久信息。其中,临时信息指临时显示的信息,比如QAction的提示等,也可以设置自己的临时信息,比如程序启动之后显示Ready,一段时间后自动消失,这个功能可以使用QStatusBar的showMessage()函数来实现;一般信息可以用来显示页码之类的;永久信息是不会消失的信息,比如可以在状态栏提示用户Caps Lock键被按下之类。QStatusBar继承自QWidget,因此它可以添加其他的QWidget,并且可以添加多个QWidget,构造出非常复杂的状态栏。

  • 给QMainWindow主窗口添加状态栏示例

QLabe*statinfo = new QLabel;

statinfo->setAlignment(Qt::AlignHCenter); //设置显示文本左对齐

statinfo->setText("状态栏");

/*添加状态栏*/

QStatusBar *stat=statusBar();

stat->addWidget(statinfo);

stat->setStyleSheet(QString("QStatusBar::item{border: 0px}"));



图5-2-6 描接窗口效果图展示

  • 下面介绍QStatusBar常用的一些函数

    1. 添加QWidget

void QStatusBar::addWidget(QWidget *widget, int stretch = 0)  //添加QWidget类(基类为QWidget都可)

void QStatusBar::removeWidget(QWidget *widget) //卸载掉不显示的控件

    2. 显示消息

void showMessage(const QString &text, int timeout = 0);

void clearMessage();

showMessage可以直接显示一些消息,timeout并且可以设置消息显示的时间,超时后消息会自动消失。

5.2.5 QmainWindow成员函数介绍


以下介绍QmainWindow在开发中常用的一些成员函数,基本每个函数都会给出相应的使用示例。

    1. 添加工具栏相关函数

void addToolBar(QToolBar *toolbar);

QToolBar *addToolBar(const QString &title);

addToolBar函数支持两种方式将工具栏添加到主窗口中。

示例:

/*方式1*/

QToolBar *fileToolBar=new QToolBar("File",this);

addToolBar(fileToolBar);

fileToolBar->addAction(fileOpenAction);

fileToolBar->addAction(fileSaveAction);

/*方式2*/

QToolBar *fileToolBar = addToolBar(tr("File"));

fileToolBar->addAction(fileOpenAction);

fileToolBar->addAction(fileSaveAction);

    2. 添加菜单栏相关函数

QMenuBar *QMainWindow::menuBar() const

void QMainWindow::setMenuBar(QMenuBar *menuBar)

    3. 卸载已添加的工具栏

void QMainWindow::removeToolBar(QToolBar *toolbar)

该函数不会把工具栏真正删除掉,只是从主窗口上移除,相当于隐藏。

    4. 保存窗口状态

/*保存与恢复主窗口的配置状态,比如:工具条布局等*/

QByteArray QMainWindow::saveState(int version = 0) const

booQMainWindow::restoreState(const QByteArray &state, int version = 0)

/*保存与恢复主窗口的尺寸大小与位置状态*/

QByteArray QWidget::saveGeometry() const

booQWidget::restoreGeometry(const QByteArray &geometry)

详细用法参考5.2.6小节。

    5. 设置工具栏图标大小

QSize iconSize() const

void setIconSize(const QSize &iconSize)

    6. 设置工具栏显示的样式

Qt::ToolButtonStyle toolButtonStyle() const

void setToolButtonStyle(Qt::ToolButtonStyle toolButtonStyle)

样式表支持的设置如下:

Qt::ToolButtonIconOnly

只显示图标     

Qt::ToolButtonTextOnly

只显示文本      

Qt::ToolButtonTextBesideIcon

文字显示在图标的右边

Qt::ToolButtonTextUnderIco

文字显示在图标的下边

Qt::ToolButtonFollowStyle

系统默认风格

示例:

/* 添加工具栏*/

QToolBar *fileToolBar = addToolBar(tr("File"));

fileToolBar->addAction(QIcon(":/image/filenew.png"),"Open");

fileToolBar->addAction(QIcon(":/image/filesave.png"),"Save");

QToolBar *editToolBar = addToolBar(tr("Edit"));

editToolBar->addAction(QIcon(":/image/editcopy.png"),"copy");

editToolBar->addAction(QIcon(":/image/editcut.png"),"cut");

this->setToolButtonStyle(Qt::ToolButtonFollowStyle);






 

图5-2-7 工具栏样式显示效果图

    7. 添加中心部件

void QMainWindow::setCentralWidget(QWidget *widget)

QWidget *QMainWindow::centralWidget() const

    8. 添加状态栏

QStatusBar *QMainWindow::statusBar() const

void QMainWindow::setStatusBar(QStatusBar *statusbar)

    9. 设置窗口组合标志

void setWindowFlags(Qt::WindowFlags type);

Qt::WindowFlags windowFlags() const;

如果想隐藏窗口的标题栏,可以进行如下的设置:

this->setWindowFlags(Qt::FramelessWindowHint);


 图5-2-8 隐藏窗口的标题栏

如果想自定义标题栏,直接使用Qt来修改是不可行的,因标题栏属于窗口管理器控制,也就受限于操作系统, 通常情况下利用Qt我们可以屏蔽标题栏, 通过布局将一个QLabel和三个按钮构成一个“标题栏”放置在顶端(视个人喜好,位置可以任意放置), 重新实现必要的事件即可实现自己个性标题栏。

5.2.6 保存窗口状态


在实际应用软件中,当配置好软件的一些窗口位置或者工具栏的布局位置之后,想要下一次打开的时候立即回到之前配置的状态,QmainWindow提供了saveState和saveGeometry()函数用于实现这些功能。

    1. 保存与恢复主窗口位置信息相关函数

QByteArray QWidget::saveGeometry() const

booQWidget::restoreGeometry(const QByteArray &geometry)

saveGeometry()函数用于获取当前主窗口的位置信息,用QByteArray字节数组返回。restoreGeometry函数:根据QByteArray字节数组保存的信息恢复之前的状态。

    2. 保存与恢复工具栏和描接窗口的布局状态相关函数

QByteArray QMainWindow::saveState(int version = 0) const

booQMainWindow::restoreState(const QByteArray &state, int version = 0)

saveState函数用于获取当前窗口中布局的状态信息,用QByteArray字节数组返回。形参version用来设置版本号,缺省值为0。restoreState用户恢复之前的设置,与saveState函数配合使用。需要注意的是:Qt中的部件只有在setObjectName后才可以saveState,restoreState。所以主窗口中的工具栏和描接窗口需要设置对象名称之后才能使用saveState,restoreState。

  • QSettings类介绍

QSettings 类提供“持久性”平台独立的应用程序设置,为了方便下次打开应用程序能够恢复到之前的状态。如果需要“非持久性”基于内存的数据结构,可以考虑使用QMap<QString,QVariant> 代替。Windows下一般将状态信息存放到注册表中,Linux下用专用的ini配置文件或者.conf文件进行保存,取决于系统本身的配置。

  • 以下是使用QSettings类编写保存、恢复主窗口的状态代码(配套程序编号CH5-2)

//负责加载配置的函数

void MainWindow::LoadState()

{

   //设置机构或公司名,应用程序名设为QtStateTest,如果机构或公司名已经存在,settings的构造函数自己会去读取上次保存的注册表或配置文件信息

  QSettings settings("QtGui", "QtStateTest");

  //判断键名是否存在,然后取出各个键名对应的键值,还原以前保存的状态

  //主窗口尺寸信息

  if(settings.contains("MainWidgetGeometryState"))

  {

      QByteArray MainWidgetGeometryState = settings.value("MainWidgetGeometryState").toByteArray();

      this->restoreGeometry(MainWidgetGeometryState);

  }

  //主窗口的状态信息

  if(settings.contains("MainWidgetState"))

  {

      QByteArray MainWidgetState = settings.value("MainWidgetState").toByteArray();

      this->restoreState(MainWidgetState);

  }

}

//负责保存配置的函数

void MainWindow::SaveState()

{

  //设置机构或公司名,应用程序名设为QtStateTest

  QSettings settings("QtGui", "QtStateTest");

  //获取主窗口尺寸状态信息

  QByteArray MainWidgetGeometryState = this->saveGeometry();

  //获取主窗口状态信息

  QByteArray MainWidgetState = this->saveState();

  //保存为配置项,键名自己随便取

  settings.setValue("MainWidgetGeometryState",MainWidgetGeometryState);

  settings.setValue("MainWidgetState",MainWidgetState);

}

加载配置函数一般在构造函数中进行调用,保存配置的函数一般在关闭软件时调用。在关闭软件时调用,就需要重写closeEvent函数,用于捕获窗口的关闭事件。

在类定义中添加void closeEvent(QCloseEvent *event);

void MainWindow::closeEvent(QCloseEvent *event)

{

    SaveState(); //保存状态

}

保存状态之后,可以打开windows的注册表进行查看保存的键值。(windows下打开注册表的快捷命令:regedit.exe)


 图5-2-9 查看保存在注册表中的键值

  • 以下介绍QSettings常用的成员函数

    1. 构造QSettings

QSettings(const QString &organization, const QString &application = QString(), QObject *parent = Q_NULLPTR)

QSettings(const QString &fileName, Format format, QObject *parent = Q_NULLPTR)

Format format格式枚举值:

QSettings::NativeFormat 

选择系统最适合的存储格式

QSettings::Registry32Format

32位系统注册表

QSettings::Registry64Format

64位系统注册表

QSettings::IniFormat

Ini配置文件

QSettings::InvalidFormat

特殊配置返回registerFormat()

构造QSettings示例1:

QSettings settings("QSettings","state");     //设置公司名称和应用程序名称

settings.setValue("Value_string","123456789"); //设置键值

if(settings.contains("Value_string")) //判断键名是否存在

{

   qDebug()<<settings.value("Value_string").toString(); // ==""123456789""

   qDebug()<<settings.fileName();

  //==注册表的路径。类似:\\HKEY_CURRENT_USER\\Software\\QSettings\\state

}

构造QSettings示例2:

QSettings settings("D:/settings.ini",QSettings::IniFormat); //设置配置文件的路径与格式

settings.setValue("Value_string","123456789"); //设置键值

if(settings.contains("Value_string")) //判断键名是否存在

{

    qDebug()<<settings.value("Value_string").toString(); // ==""123456789""

     qDebug()<<settings.fileName(); //==D:/settings.ini

}

    2. 设置键值

void QSettings:: setValue (const QString &key, const QVariant &value)

const QString &key 设置键值。const QVariant &value:设置与键值绑定的值。重复调用会覆盖之前绑定的值。

形参用到的Qvariant类型,是一个万能的数据类型,可以作为许多类型互相之间进行自动转换。

    3. 获取键值

QVariant QSettings::value(const QString &key, const QVariant &defaultValue = QVariant()) const

Value函数用于取出setValue 函数设置的键值。

示例:

QSettings settings("QSettings","state");

settings.setValue("Value_int", 888);

qDebug()<<settings.value("Value_int").toInt();  //==888

settings.setValue("Value_string","123456789");

qDebug()<<settings.value("Value_string").toString(); // ==""123456789""

    4. 判断键名是否存在

booQSettings::contains(const QString &key) const

示例:

QSettings settings("QSettings","state");     //设置公司名称和应用程序名称

settings.setValue("Value_string","123456789"); //设置键值

if(settings.contains("Value_string")) //判断键名是否存在

{

   qDebug()<<settings.value("Value_string").toString(); //取出键值==""123456789""

}

    5. 获取所有键名列表

QStringList QSettings::allKeys() const

示例:

QSettings settings;

settings.setValue("sofa", true);

settings.setValue("tv", false);

QStringList keys = settings.allKeys();

// keys: ["sofa", "tv"]

    6. 删除指定的键名

void QSettings::remove(const QString &key)

示例:

QSettings settings;

settings.setValue("ape");

settings.setValue("monkey", 1);

settings.remove("monkey");

QStringList keys = settings.allKeys();

// keys: ["ape"]

    7. 返回配置文件的路径

QString QSettings::fileName() const

fileName()返回QSettings对象存储的路径。在Windows上,如果格式设置为QSettings:NativeFormat,返回值是一个系统注册表路径,而不是一个文件路径。

    8. 返回配置文件的存储格式

Format QSettings::format() const  //返回当前存储的格式

Format QSettings::defaultFormat()  

defaultFormat函数返回系统默认的格式,用于设置QSettings(QObject *)构造函数。如果没有默认格式,直接返回QSettings::NativeFormat。

5.3 设置应用程序图标


应用程序图标,通常显示在应用程序顶层窗口的左上角,设定应用程序图标可以更加直观的显示应用程序的功能,QT中可直接调用QWindow:setWindowIcon()函数进行设置,图标的格式一般为ico格式。为了改变应用程序本身的图标,必须采用依赖于平台的技术,因为该图标会被直接呈现在桌面上。在Qt助手中搜索关键字"Setting the Application Icon"就可以看到QT在各种平台设置程序图标的方法。本小节主要是说明Windows下设置程序图标的方法。

5.3.1 设置窗口图标


QIcon windowIcon() const //获取当前应用程序图标

void setWindowIcon(const QIcon &icon) //设置当前应用程序图标

setWindowIcon设置图标的方法只适用于windows系统。如果图标发生了改变,会触发windowIconChanged(const QIcon &icon)信号,该信号的形参代表了新的图标。

示例:

this->setWindowIcon(QIcon(":/image/qt.ico"));


 图5-3-1 图标显示效果

5.3.2 设置窗口标题


QString windowTitle() const   //获取窗口标题

void setWindowTitle(const QString &) //设置窗口标题

标题显示在窗口的左上角,说明窗口实现的功能。

示例:

  this->setWindowTitle("QT文本编辑器");



图5-3-2 窗口标题设置

5.3.3 设置应用程序图标


  • 方式1:在pro文件中直接指定应用程序的图标:

RC_ICONS =image/qt.ico




 图5-3-3 设置应用程序图标

编译成功后去编译目录下查看可执行的图标已经发生变化,发送快捷方式到桌面也可以看到设置的图标。

  • 方式2:在pro文件中指定设置应用程序图标的资源文件

RC_FILE = setappico.rc

setappico.rc文件内容:

IDI_ICON1               ICON    DISCARDABLE     "qt.ico"

编译之后的效果与方式1一样。

5.4 设置应用程序启动画面


QSplashScreen类提供了一个加载应用程序启动画面的功能,可在应用程序启动期间显示一些提示信息,输出的信息主体是一张图片,可以在图片上描述应用程序的版权,作者,功能等信息。启动画面功能通常用于应用程序需要长时间启动加载情况,可以为用户应用程序加载启动的反馈信息。(例如:数据库或网络应用程序需要时间来建立连接)。

5.4.1 创建应用程序启动画面


完整程序参考(配套程序编号CH5-3)。

#include "mainwindow.h"

#include <QApplication>

#include <QSplashScreen>

#include <QThread>

int main(int argc, char *argv[])

{

  QApplication a(argc, argv);

  QPixmap pixmapSplash(":/image/splash.png"); //加载像素图片

  QSplashScreen Splash(pixmapSplash);       //构造启动画面

  Splash.show();      //显示启动画面

  Splash.showMessage(QObject::tr("应用程序加载中..."), Qt::AlignLeft|Qt::AlignBottom );

  a.processEvents();     //启动应用程序的事件处理

     

/*编写主窗口启动前需要执行的代码*/

  MainWindow w;      //主窗体

 w.thread()->sleep(3);   //这里表示延时3秒,否则闪屏结束太快看不到效果,正常情况下不需要延时。

  w.show();        

鲜花

握手

雷人

路过

鸡蛋

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了