Qt 应用程序主窗口框架
1. Qt资源系统、菜单栏和工具栏1.1 使用资源1.2 编写代码方式添加菜单1.3 菜单栏1.4 工具栏2. 中心部件3. Dock部件4. 状态栏5. 例程代码6. 自定义菜单7. 资源下载主窗口相关类关系图主窗口为建立应用程序用户界面提供了一个框架,Qt提供了QMainWindow和其他一些相关的类共同完成主窗口的管理。QMainWindow类拥有自己的布局,包含以下组件:菜单栏、工具栏、中心不见、Dock部件、状态栏。
1. Qt资源系统、菜单栏和工具栏
创建Qt Widgets应用,基类选择QMainWindow;双击左上角“在这里输入”,修改为“文件(&F)”,注意括号必须是英文半角括号,“&F被称为加速键”,按下Alt+F可以激活该菜单。修改完成后按下回车键,并在弹出的下拉菜单中将第一项改为“新建文件(&N)”,并按下回车(由于版本原因,如果无法直接输入中文,可以透过复制粘贴的方式来完成);选中该动作并将其拖入菜单栏下面的工具栏中;1.1 使用资源
第一步:添加Qt资源文件,往项目中添加新文件,选择Qt分类中的Qt Resource File,文件名称改为myimages,其他选项默认。
第二步:添加资源。打开myimages.qrc文件。到项目文件夹中新建一个名为images的文件夹,并放入两张图片。注意Qt资源系统要求资源文件必须放在与qrc文件同级或子级目录下,如果放在其他位置,添加资源时会提示将文件复制到有效的位置。回到资源管理几面单击“添加”按钮,选择“添加前缀”,然后将属性栏中的前缀改为“/image”,再单击“添加”按钮,选择“添加文件”,将刚才的两张图片选中打开即可。最后一定要按下Ctrl+S快捷键保存对文件的修改。
第三步:在Action编辑器中双击“新建文件夹”,进行如下设置:
1.2 编写代码方式添加菜单
在构造函数中添加如下代码:QMenu * editMenu = ui->menuBar->addMenu(tr("编辑(&E)")); //添加编辑菜单QAction * action_Open = editMenu->addAction(QIcon(":/image/images/open.png"),tr("打开文件(&O)"));//添加打开菜单action_Open->setShortcut(QKeySequence("Ctrl+O"));//设置快捷键ui->mainToolBar->addAction(action_Open);//在工具栏中添加动作
1.3 菜单栏
QMenuBar提供了一个水平的菜单栏,在QMainWindow中可以直接获取默认的菜单栏。下面就介绍一个动作组QActionGroup类继续在构造函数中添加代码:QActionGroup * group=new QActionGroup(this);QAction * action_L=group->addAction((tr("左对齐(&L)")));action_L->setCheckable(true);QAction * action_R=group->addAction((tr("右对齐(&R)")));action_R->setCheckable(true);QAction * action_C=group->addAction((tr("居中(&C)")));action_C->setCheckable(true);editMenu->addSeparator(); //向菜单添加分隔器editMenu->addAction(action_L);editMenu->addAction(action_R);editMenu->addAction(action_C);
1.4 工具栏
工具栏QToolBar类提供了一个包含了一组控件的、可以移动的面板。可以价格QAction对象添加到工具栏中,默认只是显示一个动作的图标,可以在QToolBar的属性栏中进行更改。在设计器中查看QToolBar的属性栏:toolButtonStyle:设置图标和相应文本的显示及其相对位置;moveable:设置状态栏是否可以移动;allowedArea:设置允许停靠的位置;iconsize:设置图标的大小;floatable:设置是否可以浮动。 工具栏除了可以添加动作外,还可以添加其他的窗口部件,下面是例子:QToolButton * toolBtn = new QToolButton(this);toolBtn->setText(tr("颜色"));QMenu * colorMenu=new QMenu(this);colorMenu->addAction(tr("红色"));colorMenu->addAction(tr("绿色"));toolBtn->setMenu(colorMenu);toolBtn->setPopupMode(QToolButton::MenuButtonPopup);ui->mainToolBar->addWidget(toolBtn);QSpinBox * spinBox = new QSpinBox(this);ui->mainToolBar->addWidget(spinBox);
2. 中心部件
主窗口的中心区域可以放置一个中心部件,一般是一个编辑器或者浏览器。这里支持单文档部件,也支持多文档部件。QTextEdit是一个高级的WYSIWYG(所见即所得)浏览器和编辑器,支持富文本的处理,为用户提供了强大的文本编辑功能。QPainTextEdit提供了一个纯文本编辑器,它与QTextEdit有很多相似之处,但无法处理富文本。QTextBrowser是一个富文本浏览器,可以看做是QTextEdit的只读模式。中心区域还可以使用多文档部件。Qt中QMdiArea部件就是提供一个可以显示多文档界面的区域,从而有效地管理过个窗口。QMdiArea中的子窗口由QMdiSubWindow类提供,这个类有自己的布局,包含一个标题栏和一个中心区域,可以向它的中心区域添加部件。
#include <QTextEdit>#include <QMdiSubWindow>
void MainWindow::on_action_New_triggered(){//新建文本编辑器部件QTextEdit * edit = new QTextEdit(this);QMdiSubWindow * child=ui->mdiArea->addSubWindow(edit);child->setWindowTitle(tr("多文档编辑器子窗口"));child->show();}
3. Dock部件
QDockWidget类提供了这样一个部件,可以停靠在QMainWindow中,也可以悬浮起来作为桌面顶级窗口。Dock部件一般用于存放一些其他部件来实现特殊功能,就像一个工具箱。在主窗口中可以停靠在中心部件的四周,也可以悬浮起来被拖动到任意的地方,还可以被关闭或隐藏起来。一个Dock部件包含一个标题栏和一个内容区域,可以向Dock部件中放入任何部件。添加“显示 Dock”动作,这样在Dock窗口被关闭后,还可以在这里重新打开。
void MainWindow::on_action_Dock_triggered(){ui->dockWidget->show();}
4. 状态栏
QStatusbar类提供了一个水平条部件,用来显示状态信息。目前设计器还不支持直接向状态栏中拖放部件,所以需要使用代码来生成。//显示临时消息,显示2000毫秒ui->statusBar->showMessage(tr("欢迎使用多文档编辑器"),2000);//创建标签,设置标签样式并显示信息,然后将其永久部件的形式添加到状态栏QLabel * permanent = new QLabel(this);permanent->setFrameStyle(QFrame::Box|QFrame::Sunken);permanent->setText("/weixin_38566632?spm=1000.2115.3001.5343");ui->statusBar->addPermanentWidget(permanent);
5. 例程代码
#include "mainwindow.h"#include "ui_mainwindow.h"#include <QToolButton>#include <QSpinBox>#include <QTextEdit>#include <QMdiSubWindow>#include <QLabel>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow){ui->setupUi(this);QMenu * editMenu = ui->menuBar->addMenu(tr("编辑(&E)")); //添加编辑菜单QAction * action_Open = editMenu->addAction(QIcon(":/image/images/open.png"),tr("打开文件(&O)"));//添加打开菜单action_Open->setShortcut(QKeySequence("Ctrl+O"));//设置快捷键ui->mainToolBar->addAction(action_Open);//在工具栏中添加动作QActionGroup * group=new QActionGroup(this);QAction * action_L=group->addAction((tr("左对齐(&L)")));action_L->setCheckable(true);QAction * action_R=group->addAction((tr("右对齐(&R)")));action_R->setCheckable(true);QAction * action_C=group->addAction((tr("居中(&C)")));action_C->setCheckable(true);editMenu->addSeparator(); //向菜单添加分隔器editMenu->addAction(action_L);editMenu->addAction(action_R);editMenu->addAction(action_C);QToolButton * toolBtn = new QToolButton(this);toolBtn->setText(tr("颜色"));QMenu * colorMenu=new QMenu(this);colorMenu->addAction(tr("红色"));colorMenu->addAction(tr("绿色"));toolBtn->setMenu(colorMenu);toolBtn->setPopupMode(QToolButton::MenuButtonPopup);ui->mainToolBar->addWidget(toolBtn);QSpinBox * spinBox = new QSpinBox(this);ui->mainToolBar->addWidget(spinBox);//显示临时消息,显示2000毫秒ui->statusBar->showMessage(tr("欢迎使用多文档编辑器"),2000);//创建标签,设置标签样式并显示信息,然后将其永久部件的形式添加到状态栏QLabel * permanent = new QLabel(this);permanent->setFrameStyle(QFrame::Box|QFrame::Sunken);permanent->setText("/weixin_38566632?spm=1000.2115.3001.5343");ui->statusBar->addPermanentWidget(permanent);}MainWindow::~MainWindow(){delete ui;}void MainWindow::on_action_New_triggered(){//新建文本编辑器部件QTextEdit * edit = new QTextEdit(this);QMdiSubWindow * child=ui->mdiArea->addSubWindow(edit);child->setWindowTitle(tr("多文档编辑器子窗口"));child->show();}void MainWindow::on_action_Dock_triggered(){ui->dockWidget->show();}
6. 自定义菜单
在菜单中也可以使用其他部件,但需要新建一个类:myaction.h
#ifndef MYACTION_H#define MYACTION_H#include <QWidgetAction>class QLineEdit;// 前置声明class MyAction : public QWidgetAction{Q_OBJECTpublic:explicit MyAction(QObject *parent = 0);protected:// 声明函数,该函数是QWidgetAction类中的虚函数QWidget* createWidget(QWidget *parent);signals:// 新建信号,用于在按下回车键时,将行编辑器中的内容发射出去void getText(const QString &string);private slots:// 新建槽,它用来与行编辑器的按下回车键信号关联void sendText();private:// 定义行编辑器对象的指针QLineEdit *lineEdit;};#endif // MYACTION_H
myaction.cpp
#include "myaction.h"#include <QLineEdit>#include <QSplitter>#include <QLabel>MyAction::MyAction(QObject *parent) :QWidgetAction(parent){// 创建行编辑器lineEdit = new QLineEdit;// 将行编辑器的按下回车键信号与我们的发送文本槽关联connect(lineEdit, &QLineEdit::returnPressed, this, &MyAction::sendText);}QWidget * MyAction::createWidget(QWidget *parent) //创建部件{// 这里使用inherits()函数判断父部件是否是菜单或者工具栏// 如果是,则创建该父部件的子部件,并且返回子部件// 如果不是,则直接返回0if(parent->inherits("QMenu") || parent->inherits("QToolBar")){QSplitter *splitter = new QSplitter(parent);QLabel *label = new QLabel;label->setText(tr("插入文本:"));splitter->addWidget(label);splitter->addWidget(lineEdit);return splitter;}return 0;}void MyAction::sendText(){emit getText(lineEdit->text()); // 发射信号,将行编辑器中的内容发射出去lineEdit->clear();// 清空行编辑器中的内容}
7. 资源下载
/download/weixin_38566632/85122762