300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > Qt应用程序主窗口框架

Qt应用程序主窗口框架

时间:2022-03-02 13:24:45

相关推荐

Qt应用程序主窗口框架

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。