QT常用控件(一)——菜单栏和对话框
引言
QMainWindow 是一个为用户提供主窗口程序的类,包含一个菜单栏(menu bar)、多个工具栏(tool bars)、多个锚接部件(dock widgets)、一个状态栏(status bar)及一个中心部件(central widget),是许多应用程序的基础,如文本编辑器,图片编辑器等。(本篇主要介绍菜单栏和工具栏)

一,菜单栏
- 创建菜单栏。
QMenuBar* menuBar = new QMenuBar(this);
- 创建菜单,调用 QMenu 的成员函数 addMenu 来添加菜单
QAction* addMenu(QMenu * menu)
QMenu* addMenu(const QString & title)
QMenu* addMenu(const QIcon & icon, const QString & title)
- 创建菜单项,调用 QMenu 的成员函数 addAction 来添加菜单项
QAction* activeAction()
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)
实例演示:(vs2019+qt5)
//创建菜单栏
QMenuBar* menuBar = new QMenuBar(this);
//创建菜单(用addMenu方法添加入菜单栏)
QMenu* filename = menuBar->addMenu(QStringLiteral("文件(&F)"));
//创建菜单项
QAction* openfile = new QAction(QStringLiteral("打开文件(&O)"));
QAction* opendlg = new QAction(QStringLiteral("打开对话框(&D)"));
//给菜单项添入图标
openfile->setIcon(QIcon(":/D:/image/Luffy.png"));
opendlg->setIcon(QIcon(":/D:/image/LuffyQ.png"));
//用addAction加入菜单项
filename->addAction(opendlg);
filename->addAction(openfile);

注意:使用 QStringLiteral 宏可以在编译期把代码里的常量字符串 str 直接构造为 QString 对象,于是运行时就不再需要额外的构造开销了。
资源文件的添加
openfile->setIcon(QIcon(":/D:/image/Luffy.png"));
对于该句代码":/D:/image/Luffy.png"是以相对路径添加的(即以:/开头的是资源文件),那么如何添加资源文件呢?
- 添加->新建项->Qt->Qt Resource File。

- 在Resource1.qrc中添加说需要的资源(比如图片)

最后以冒号+前缀+名称(相对路径)写入资源。
二,工具栏
- 直接调用 QMainWindow 类的 addToolBar()函数获取主窗口的工具条对象,每增加一个工具条都需要调用一次该函数
- 插入属于工具条的动作,即在工具条上添加操作。通过 QToolBar 类的 addAction 函数添加
- 工具条是一个可移动的窗口,它的停靠区域由 QToolBar 的 allowAreas 决定,包括:
- Qt::LeftToolBarArea 停靠在左侧
- Qt::RightToolBarArea停靠在右侧
- Qt::TopToolBarArea 停靠在顶部
- Qt::BottomToolBarArea停靠在底部
- Qt::AllToolBarAreas以上四个位置都可停靠
使用 setAllowedAreas()函数指定停靠区域:
setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea)
setMoveable(false)//工具条不可移动, 只能停靠在初始化的位置上
三,对话框 QDialog
- 模态对话框,就是会阻塞同一应用程序中其它窗口的输入。模态对话框很常见,比如“打开文件”功能。你可以尝试一下记事本的打开文件,当打开文件对话框出现时,我们是不能对除此对话框之外的窗口部分进行操作的。
- 与此相反的是非模态对话框,例如查找对话框,我们可以在显示着查找对话框的同时,继续对记事本的内容进行编辑。
- 使用 QDialog::exec()实现应用程序级别的模态对话框
- 使用 QDialog::open()实现窗口级别的模态对话框
- 使用 QDialog::show()实现非模态对话框。
模态对话框实例:
QDialog dlg1(this);
dlg1.resize(300,200);
dlg1.setWindowTitle(QStringLiteral("模态对话框"));
dlg1.exec();
非模态对话框实例:
QDialog dlg1(this);
dlg1.resize(300,200);
dlg1.setWindowTitle(QStringLiteral("模态对话框"));
dlg1.show();
QDialog *dlg2 = new QDialog();
dlg2->resize(200, 200);
dlg2->setAttribute(Qt::WA_DeleteOnClose);//关闭时清理内存
dlg2->show();
注意:在堆上就不能用点(.)了,要用->。而且由于使用 new 在堆上分配空间,却一直没有 delete。因此我们用setAttribute()函数设置对话框关闭时,自动销毁对话框。
2️⃣标准文件对话框
QString getOpenFileName(QWidget * parent = 0, //父窗口
const QString & caption = QString(), //对话框标题
const QString & dir = QString(), //对话框打开的默认路径
const QString & filter = QString(), //过滤器(例如我们使用“imagefile(*.jpg*.png)”则只显示jpg和png文件。多个过滤器用“;;”分割。
QString * selectedFilter = 0, //默认选择的过滤器
Options options = 0 //对话框的参数设定
)
//打开文件
void MainWindow::openFile()
{
QString path = QFileDialog::getOpenFileName(this, tr("Open File"), ".", tr("Text Files(*.txt)"));
if(!path.isEmpty())
{
QFile file(path);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
{
QMessageBox::warning(this, tr("Read File"), tr("Cannot open file:\n%1").arg(path));
return;
}
QTextStream in(&file);
textEdit->setText(in.readAll());
file.close();
}
else
{
QMessageBox::warning(this, tr("Path"), tr("You did not select any file."));
}
}
//保存文件
void MainWindow::saveFile()
{
QString path = QFileDialog::getSaveFileName(this, tr("Open File"), ".", tr("Text Files(*.txt)"));
if(!path.isEmpty())
{
QFile file(path);
if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
{
QMessageBox::warning(this, tr("Write File"), tr("Cannot open file:\n%1").arg(path));
return;
}
QTextStream out(&file);
out << textEdit->toPlainText();
file.close();
}
else
{
QMessageBox::warning(this, tr("Path"), tr("You did not select any file."));
}
}
实例演示:创建菜单栏,菜单项为打开文件夹和对话框。点击打开对应功能。
//菜单文件
// 使用 QStringLiteral 宏可以在编译期把代码里的常量字符串 str 直接构造为 QString 对象,于是运行时就不再需要额外的构造开销了。
QMenuBar* menuBar = new QMenuBar(this);
QMenu* filename = menuBar->addMenu(QStringLiteral("文件(&F)"));
QAction* openfile = new QAction(QStringLiteral("打开文件(&O)"));
QAction* opendlg = new QAction(QStringLiteral("打开对话框(&D)"));
openfile->setIcon(QIcon(":/D:/image/Luffy.png"));
opendlg->setIcon(QIcon(":/D:/image/LuffyQ.png"));
filename->addAction(opendlg);
filename->addAction(openfile);
//打开对话框
connect(opendlg, &QAction::triggered, [=]() {
//模态对话框(不可对其他对话框操作)
QDialog dlg1(this);
dlg1.resize(300,200);
dlg1.setWindowTitle(QStringLiteral("模态对话框"));
dlg1.exec();
//非模态对话框(可以对其他对话框操作)
// QDialog *dlg2 = new QDialog();
//dlg2->resize(200, 200);
//dlg2->setAttribute(Qt::WA_DeleteOnClose);//关闭时清理内存
//dlg2->show();
});
//打开文件夹
connect(openfile, &QAction::triggered, [=]() {
QFileDialog fdlg(this);
fdlg.getOpenFileName(this, QStringLiteral("选择文件"), "D:\\", tr("Image(*.jpg*.png)")); });
QT常用控件(一)——菜单栏和对话框的更多相关文章
- Qt常用控件
Qt常用控件 QWidget与QFrame QWidget所有图形控件的基类 QFrame与QWidget的区别 QFrame是基本控件的基类, QWidget是QFrame的基类. 因此QFrame ...
- QT常用控件(三)——自定义控件封装
引言 Qt已经提供了很多的基础控件供开发使用,而Qt原生的控件有时候并不能满足我们的需求,特别是在工业的运用上,比如我们需要一个日期时间的选择器,Qt虽然已经提供了原生的QDateTime控件,但这个 ...
- QT 常用控件二
QT提供QHBoxLayout类.QVBoxlayout类及QGridLayout类等的基本布局管理,分别是水平排列布局,垂直排列布局和网格排列布局 addWidget()方法用于向布局中加入需要布局 ...
- Qt——常用控件样式
下面是我设计.调整.修改的Qt控件样式,仅供参考. Github地址:https://github.com/ikongziming/QtDemo/tree/master/StyleSheetDemo ...
- QT 常用控件一
QWidget 创建窗口 如果widget未使用腹肌进行创建,则在显示时视为窗口或顶层widget. 由于顶层widget没有父级对象类来确保在其不再使用时删除,所以需要开发人员在应用程序中对其进程跟 ...
- QT+常用控件_Line Edit
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QDebug> #incl ...
- QT_7_资源文件_对话框_QMessageBox_界面布局_常用控件
资源文件 1.1. 将资源导入到项目下 1.2. 添加文件—>Qt -->Qt Resource File 1.3. 起名称 res ,生成res.qrc文件 1.4. 右键 open i ...
- Qt基本控件及三大布局
Qt基本控件及三大布局 来源: http://blog.csdn.net/a2604539133/article/details/73920696 Qt基本模块 一.Qt的三大布局 QHBoxLayo ...
- winform常用控件介绍
1.窗体 12.Label 控件 33.TextBox 控件 44.RichTextBox控件 55.NumericUpDown 控件 76.Button 控件 77.GroupBox 控件 78.R ...
随机推荐
- 在vue项目中使用echarts
1.安装echarts依赖npm install echarts --save 2.在要使用的页面引入import echarts from 'echarts'v5之后使用 import * echa ...
- Java中对象调用方法的顺序
Java虚拟机会预先为加载到内存中的每个类维护一个方法表(Method Table),其中列出了所有类中所有方法的签名. 现在有2个类A和B,其中,B是A的子类,和一个B类型的对象x,当调用x.f(a ...
- Arduino库和STM32的寄存器、标准库、HAL库、LL库开发比较之GPIO
标题: Arduino库和STM32的寄存器.标准库.HAL库.LL库开发比较之GPIO 作者: 梦幻之心星 sky-seeker@qq.com 标签: [#Arduino,#STM32,#库,#开发 ...
- Vue3全家桶升级指南二ref、toRef、toRefs的区别
ref是对原始数据的拷贝,当修改ref数据时,模板中的视图会发生改变,但是原始数据并不会改变. toRef是对原始数据的引用,修改toRef数据时,原始数据也会发生改变,但是视图并不会更新. 在vue ...
- Vue 消除Token过期时刷新页面的重复提示
1.问题现象 页面长时间未操作,再刷新页面时,第一次弹出"token失效,请重新登录!"提示,然后跳转到登录页面,接下来又弹出了n个"Token已过期"的后 ...
- CRM企业管理系统一年多少钱?
CRM系统一年多少钱?这是很多企业管理者比较关心的问题.目前市面上的CRM系统分为本地部署型和云部署型.云部署型CRM费用相对较低,只需要按需购买账号,连接网络即可使用:本地部署型CRM费用较高,企业 ...
- RabbitMQ交换机
RabbitMQ中,生产者并不是直接将消息发送给queue,而是先将消息发送给exchange,再由exchange通过不同的路由规则将消息路由到绑定的队列中进行存储,那么为什么要先将消息发送给exc ...
- 传统mvc platform与前后端分离项目smart 共用域名nginx配置
#server { # listen 80; # server_name 139.129.100.155 rjhaasz.cn; # rewrite ^(.*)$ https://$host$1 pe ...
- linux 中只显示目录的几种方法
ls 参数 -a 表示显示所有文件,包含隐藏文件-d 表示显示目录自身的属性,而不是目录中的内容-F 选项会在显示目录条目时,在目录后加一个/ ls -l total 8 drwxrwxr-x 2 r ...
- 【论文小综】基于外部知识的VQA(视觉问答)
我们生活在一个多模态的世界中.视觉的捕捉与理解,知识的学习与感知,语言的交流与表达,诸多方面的信息促进着我们对于世界的认知.作为多模态领域的一个典型场景,VQA旨在结合视觉的信息来回答所提出的问题 ...