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应用程序主窗口框架相关推荐

  1. Qt应用程序主窗口之一:主窗口框架

    对于日常见到的应用程序而言,许多都是基于主窗口的,主窗口中包含了菜单栏.工具栏.状态栏和中心区域等.这一章会详细介绍主窗口的每一个部分,还会涉及资源管理.富文本处理.拖放操作和文档打印等相关内容.重点 ...

  2. python PyQt5 QMainWindow类(Qt主窗口框架,主窗口提供了用于构建应用程序用户界面的框架)

    https://doc.qt.io/qtforpython/PySide2/QtWidgets/QMainWindow.html?highlight=qmainwindow#PySide2.QtWid ...

  3. 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 ...

  4. QT学习笔记(六):Qt5主窗口框架示例

    QT学习笔记(五):Qt5主窗口框架代码示例 一.添加编辑菜单:并在下拉菜单和工具栏中添加"打开文件"动作菜单 #include <QToolButton> #incl ...

  5. 第五章 应用程序主窗口

    2019-9-11 主窗口框架 菜单栏(菜单项由QAction动作类实现).工具栏(可以移动).中心部件(放入窗口部件).Dock部件.状态栏 1)使用资源(Qt资源文件.嵌入到可执行文件之中).菜单 ...

  6. QT 应用程序和窗口添加图标

    QT 应用程序和窗口添加图标 前言 新建一个QT工程,直接编译运行,可执行程序是没有任何图标的.如下图: 编译后 运行时: 这里简单介绍一下如何添加图标. 选择图标 自己不会设计图标的话,不如去图标库 ...

  7. 使用类前置声明的好处-结合Qt 4一个主窗口实例讲解

    本实例实现一个基本的主窗口程序,包含一个菜单条.一个工具栏.中央可编辑窗体及状态栏. 主窗口头文件代码如下: 1 #ifndef MAINWINDOW_H 2 #define MAINWINDOW_H ...

  8. 实例1.2:获得应用程序主窗口指针

    主窗口指针保存在CWinThread::m_pMainWnd中,可以先调用AfxGetApp函数获得应用程序的指针,然后通过应用程序的指针获得其主窗口的指针. //获得应用程序指针CMy1_2App* ...

  9. Delphi非应用程序主窗口创建MDI

    对Delphi很熟悉的人,都知道MDI窗口的创建方式,是将主窗口的formstyle设置成MDIForm,然后将各个要设置成MDI的窗口的FormStyle都设置成MDIChild,运行就可以看到效果 ...

最新文章

  1. ​kdevelop用法_weixin_44594953的博客-CSDN博客_kdevelop​
  2. 思科发力虚拟化和云服务 推出多款新品
  3. 对2014年,关于轻应用的五大预言
  4. JAVA.IO字符流
  5. Web后端语言模拟http请求(带用户名和密码)实例代码大全
  6. java中的与或非_与或非 · java development · 看云
  7. c语言程序设计夏宽理第三版答案,(100)西南大学2021计算机考研数据速览(特别更新版),民族脊梁袁隆平院士的母校!...
  8. Docker CE for CentOS的安装(对官方文档的翻译)
  9. 【英语学习】【Level 07】U02 Live Work L6 A countryside house
  10. Visual Studio 解决方案版本从v12-->v14
  11. a大于10小于15C语言,计算机基础复习模拟试卷
  12. 本地语音控制模块 | 带语音识别的智能家居方案
  13. 没有提取码怎么获取百度网盘资源?
  14. linux查看键盘命令,usb键盘鼠标 linux驱动查看及安装
  15. leapftp,小编悄悄告诉你leapftp是什么
  16. php 许愿墙 阶段案例_PHP+jQueryUI实现许愿墙功能、贴便签、贴标签功能(案例)...
  17. CSDN的第一节课的感想,nice!!!
  18. 微信多开设置网络代理服务器,微信多开终极技巧,可随意控制数量已亲测很好用...
  19. 把linux装在移动硬盘上,我将Linux装到了移动硬盘上o(∩_∩)o
  20. selenium被检测了怎么办?

热门文章

  1. cmd命令之参数 c
  2. 加菲猫的人生歪理~ 看完果然开心,哈哈~
  3. Entity Framework 6 执行Linq to Entities异常“p__linq__1 : String truncation: max=0, len=2, value=‘测试‘“
  4. 0046 @Transactional注解的几个参数--事务传播控制--事务隔离级别--异常与回滚
  5. SQLSERVER误删除了Windows登录用户验证方式使用Windows身份验证的解决方法
  6. 关于使用IDEA导入项目后依赖报错的解决方案
  7. git remote prune,git prune,git fetch --prune等有什么区别
  8. 在Bash中重定向stderr和stdout
  9. 将先前的提交分成多个提交
  10. java编程窗口在哪里下载_EeJava下载