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("https://blog.csdn.net/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("https://blog.csdn.net/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_OBJECT
public: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. 资源下载
https://download.csdn.net/download/weixin_38566632/85122762
Qt应用程序主窗口框架相关推荐
- Qt应用程序主窗口之一:主窗口框架
对于日常见到的应用程序而言,许多都是基于主窗口的,主窗口中包含了菜单栏.工具栏.状态栏和中心区域等.这一章会详细介绍主窗口的每一个部分,还会涉及资源管理.富文本处理.拖放操作和文档打印等相关内容.重点 ...
- python PyQt5 QMainWindow类(Qt主窗口框架,主窗口提供了用于构建应用程序用户界面的框架)
https://doc.qt.io/qtforpython/PySide2/QtWidgets/QMainWindow.html?highlight=qmainwindow#PySide2.QtWid ...
- QT creator使用(五):应用程序主窗口QMainWindow
目录 5.0 本章简介 5.1 主窗口框架 5.1.1 Qt资源系统.菜单栏和工具栏 5.1.2 中心部件 5.1.3 Dock部件 5.1.4 状态栏 5.1.5 自定义菜单 5.2 富文本处理 5 ...
- QT学习笔记(六):Qt5主窗口框架示例
QT学习笔记(五):Qt5主窗口框架代码示例 一.添加编辑菜单:并在下拉菜单和工具栏中添加"打开文件"动作菜单 #include <QToolButton> #incl ...
- 第五章 应用程序主窗口
2019-9-11 主窗口框架 菜单栏(菜单项由QAction动作类实现).工具栏(可以移动).中心部件(放入窗口部件).Dock部件.状态栏 1)使用资源(Qt资源文件.嵌入到可执行文件之中).菜单 ...
- QT 应用程序和窗口添加图标
QT 应用程序和窗口添加图标 前言 新建一个QT工程,直接编译运行,可执行程序是没有任何图标的.如下图: 编译后 运行时: 这里简单介绍一下如何添加图标. 选择图标 自己不会设计图标的话,不如去图标库 ...
- 使用类前置声明的好处-结合Qt 4一个主窗口实例讲解
本实例实现一个基本的主窗口程序,包含一个菜单条.一个工具栏.中央可编辑窗体及状态栏. 主窗口头文件代码如下: 1 #ifndef MAINWINDOW_H 2 #define MAINWINDOW_H ...
- 实例1.2:获得应用程序主窗口指针
主窗口指针保存在CWinThread::m_pMainWnd中,可以先调用AfxGetApp函数获得应用程序的指针,然后通过应用程序的指针获得其主窗口的指针. //获得应用程序指针CMy1_2App* ...
- Delphi非应用程序主窗口创建MDI
对Delphi很熟悉的人,都知道MDI窗口的创建方式,是将主窗口的formstyle设置成MDIForm,然后将各个要设置成MDI的窗口的FormStyle都设置成MDIChild,运行就可以看到效果 ...
最新文章
- ​kdevelop用法_weixin_44594953的博客-CSDN博客_kdevelop​
- 思科发力虚拟化和云服务 推出多款新品
- 对2014年,关于轻应用的五大预言
- JAVA.IO字符流
- Web后端语言模拟http请求(带用户名和密码)实例代码大全
- java中的与或非_与或非 · java development · 看云
- c语言程序设计夏宽理第三版答案,(100)西南大学2021计算机考研数据速览(特别更新版),民族脊梁袁隆平院士的母校!...
- Docker CE for CentOS的安装(对官方文档的翻译)
- 【英语学习】【Level 07】U02 Live Work L6 A countryside house
- Visual Studio 解决方案版本从v12-->v14
- a大于10小于15C语言,计算机基础复习模拟试卷
- 本地语音控制模块 | 带语音识别的智能家居方案
- 没有提取码怎么获取百度网盘资源?
- linux查看键盘命令,usb键盘鼠标 linux驱动查看及安装
- leapftp,小编悄悄告诉你leapftp是什么
- php 许愿墙 阶段案例_PHP+jQueryUI实现许愿墙功能、贴便签、贴标签功能(案例)...
- CSDN的第一节课的感想,nice!!!
- 微信多开设置网络代理服务器,微信多开终极技巧,可随意控制数量已亲测很好用...
- 把linux装在移动硬盘上,我将Linux装到了移动硬盘上o(∩_∩)o
- selenium被检测了怎么办?
热门文章
- cmd命令之参数 c
- 加菲猫的人生歪理~ 看完果然开心,哈哈~
- Entity Framework 6 执行Linq to Entities异常“p__linq__1 : String truncation: max=0, len=2, value=‘测试‘“
- 0046 @Transactional注解的几个参数--事务传播控制--事务隔离级别--异常与回滚
- SQLSERVER误删除了Windows登录用户验证方式使用Windows身份验证的解决方法
- 关于使用IDEA导入项目后依赖报错的解决方案
- git remote prune,git prune,git fetch --prune等有什么区别
- 在Bash中重定向stderr和stdout
- 将先前的提交分成多个提交
- java编程窗口在哪里下载_EeJava下载