点击上方蓝字关注我们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 菜单栏效果图 1. aboutToHide信号:点击菜单标题触发(获得焦点)。 2. aboutToShow()信号:与aboutToHide信号相反,菜单标题失去焦点时触发。 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 菜单栏效果图 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类提供了一个可移动工具面板,可以用来添加类似按钮效果的选项。工具栏一般位于菜单栏的下面,可以拖动停留在主窗口的上下左右四个方向。一个主窗口可以添加多个工具面板。 /* 初始化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继承于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 描接窗口效果图展示 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,构造出非常复杂的状态栏。 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 描接窗口效果图展示 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 类提供“持久性”平台独立的应用程序设置,为了方便下次打开应用程序能够恢复到之前的状态。如果需要“非持久性”基于内存的数据结构,可以考虑使用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 查看保存在注册表中的键值 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 设置应用程序图标 图5-3-3 设置应用程序图标 编译成功后去编译目录下查看可执行的图标已经发生变化,发送快捷方式到桌面也可以看到设置的图标。 方式2:在pro文件中指定设置应用程序图标的资源文件 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(已满)
我知道了