QT基础入门——QMainWindow与对话框QDialog(三)

news2024/10/7 14:30:01

前言:

Qt 并没有专门的菜单项类,只是使用一个QAction类,抽象出公共的动作。当我们把QAction对象添加到菜单,就显示成一个菜单项,添加到工具栏,就显示成一个工具按钮。用户可以通过点击菜单项、点击工具栏按钮、点击快捷键来激活这个动作。对话框是 GUI 程序中不可或缺的组成部分。很多不能或者不适合放入主窗口的功能组件都必须放在对话框中设置。对话框通常会是一个顶层窗口,出现在程序最上层,用于实现短期任务或者简洁的用户交互。

目录

一、QMainWindow

1.菜单栏

2.工具栏

 3.状态栏

 4.铆接部件

​编辑

5. 核心部件(中心部件)

6.整体代码:

7.资源文件

二、对话框QDialog

1.自定义对话框:

2. 标准对话框

 (1)颜色对话框

 (2)文件对话框

 (3)字体对话框

3.消息对话框

(1)错误对话框

(2)信息对话框

 (3)问题对话框

(4)警告对话框


一、QMainWindow

QMainWindow是一个为用户提供主窗口程序的类,包含一个菜单栏(menu bar)多个工具栏(tool bars)多个锚接部件(dock widgets)一个状态栏(status bar)一个中心部件(central widget),是许多应用程序的基础,如文本编辑器,图片编辑器等。

1.菜单栏

一个主窗口最多只有一个菜单栏。位于主窗口顶部、主窗口标题栏下面。

    //头文件   #include "mainwindow.h"
    //#include <QMenuBar>

    //重置窗口的大小
    resize(600,400);

    /************************************************/
    //菜单栏  最多只能有一个
    //菜单栏
    /************************************************/
    QMenuBar * bar = menuBar();
    //将菜单栏放入到窗口中
    setMenuBar(bar);

    //创建菜单
    QMenu * fileMenu = bar->addMenu("文件");
    QMenu * editMenu = bar->addMenu("编辑");

    //创建菜单项
    QAction * newAction = fileMenu->addAction("新建");
    //添加分隔符
    fileMenu->addSeparator();
    QAction * openAction = fileMenu->addAction("打开");

Qt 并没有专门的菜单项类,只是使用一个QAction类,抽象出公共的动作。当我们把QAction对象添加到菜单,就显示成一个菜单项,添加到工具栏,就显示成一个工具按钮。用户可以通过点击菜单项、点击工具栏按钮、点击快捷键来激活这个动作。

2.工具栏

主窗口的工具栏上可以有多个工具条,通常采用一个菜单对应一个工具条的的方式,也可根据需要进行工具条的划分。


    //头文件  #include <QToolBar>

    /************************************************/
    //工具栏   可以有多个
    //工具栏
    /************************************************/

    QToolBar * toolBar = new QToolBar(this);
    addToolBar(Qt::LeftToolBarArea,toolBar);

    //后期设置 只允许
    toolBar->setAllowedAreas(Qt::LeftToolBarArea|Qt::RightToolBarArea);
    //设置浮动
    toolBar->setFloatable(false);
    //设置移动(总开关)
    toolBar->setMovable(false);
    //工具栏中设置内容
    toolBar->addAction(newAction);
    //添加分割线
    toolBar->addSeparator();
    toolBar->addAction(openAction);
    //工具栏中添加一些控件
    QPushButton * btn = new QPushButton("编辑",this);
    toolBar->addWidget(btn);

 3.状态栏

派生自QWidget类,使用方法与QWidget类似,QStatusBar类常用成员函数

状态栏也只能最多有一个

    //头文件  #include <QLabel>

    /************************************************/
    //状态栏  最多有一个
    //状态栏
    /************************************************/
    QStatusBar * stBar = statusBar();
    //设置到窗口中
    setStatusBar(stBar);
    //放标签的控件
    QLabel * label = new QLabel("提示信息",this);
    stBar->addWidget(label);
    QLabel * label2 = new QLabel("右侧提示信息",this);
    stBar->addPermanentWidget(label2);

 4.铆接部件

铆接部件 QDockWidget,也称浮动窗口,可以有多个

    //头文件:#include <QDockWidget>

    /************************************************/
    //铆接部件(滑动窗口)   可以有多个
    //铆接部件
    /************************************************/
    QDockWidget * dockWidget = new QDockWidget("滑动",this);
    addDockWidget(Qt::BottomDockWidgetArea,dockWidget);
    //  设置后期停靠区域,只允许上下
    dockWidget->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);


5. 核心部件(中心部件)

除了以上几个部件,中心显示的部件都可以作为核心部件,例如一个记事本文件,可以利用QTextEdit做核心部件

    //头文件  #include <QTextEdit>

    /************************************************/
    //设置中心部件  只能一个
    //中心部件
    /************************************************/
    QTextEdit * edit = new QTextEdit(this);
    setCentralWidget(edit);

6.整体代码:

#include "mainwindow.h"
#include <QMenuBar>
#include <QDebug>
#include <QToolBar>
#include <QPushButton>
#include <QStatusBar>
#include <QLabel>
#include <QDockWidget>
#include <QTextEdit>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    //重置窗口的大小
    resize(600,400);

    /************************************************/
    //菜单栏  最多只能有一个
    //菜单栏
    /************************************************/

    QMenuBar * bar = menuBar();
    //将菜单栏放入到窗口中
    setMenuBar(bar);
    //创建菜单
    QMenu * fileMenu = bar->addMenu("文件");
    QMenu * editMenu = bar->addMenu("编辑");
    //创建菜单项
    QAction * newAction = fileMenu->addAction("新建");
    //添加分隔符
    fileMenu->addSeparator();
    QAction * openAction = fileMenu->addAction("打开");

    /************************************************/
    //工具栏   可以有多个
    //工具栏
    /************************************************/
    QToolBar * toolBar = new QToolBar(this);
    addToolBar(Qt::LeftToolBarArea,toolBar);

    //后期设置 只允许
    toolBar->setAllowedAreas(Qt::LeftToolBarArea|Qt::RightToolBarArea);
    //设置浮动
    toolBar->setFloatable(false);
    //设置移动(总开关)
    toolBar->setMovable(false);
    //工具栏中设置内容
    toolBar->addAction(newAction);
    //添加分割线
    toolBar->addSeparator();
    toolBar->addAction(openAction);
    //工具栏中添加一些控件
    QPushButton * btn = new QPushButton("编辑",this);
    toolBar->addWidget(btn);

    /************************************************/
    //状态栏  最多有一个
    //状态栏
    /************************************************/

    QStatusBar * stBar = statusBar();
    //设置到窗口中
    setStatusBar(stBar);
    //放标签的控件
    QLabel * label = new QLabel("提示信息",this);
    stBar->addWidget(label);
    QLabel * label2 = new QLabel("右侧提示信息",this);
    stBar->addPermanentWidget(label2);

    /************************************************/
    //铆接部件(滑动窗口)   可以有多个
    //铆接部件
    /************************************************/
    QDockWidget * dockWidget = new QDockWidget("滑动",this);
    addDockWidget(Qt::BottomDockWidgetArea,dockWidget);
    //  设置后期停靠区域,只允许上下
    dockWidget->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);

    /************************************************/
    //设置中心部件  只能一个
    //中心部件
    /************************************************/
    QTextEdit * edit = new QTextEdit(this);
    setCentralWidget(edit);

}

MainWindow::~MainWindow()
{
}

7.资源文件

Qt 资源系统是一个跨平台的资源机制,用于将程序运行时所需要的资源以二进制的形式存储于可执行文件内部。如果你的程序需要加载特定的资源(图标、文本翻译等),那么,将其放置在资源文件中,就再也不需要担心这些文件的丢失。也就是说,如果你将资源以资源文件形式存储,它是会编译到可执行文件内部。

(1)使用 Qt Creator 可以很方便地创建资源文件。我们可以在工程上点右键,选择“添加新文件…”,可以在 Qt 分类下找到“Qt 资源文件”:

(2)点击“选择…”按钮,打开“新建 Qt 资源文件”对话框。在这里我们输入资源文件的名字和路径: 

 (3)点击下一步,选择所需要的版本控制系统,然后直接选择完成。我们可以在 Qt Creator 的左侧文件列表中看到“资源文件”一项,也就是我们新创建的资源文件:

 (4)右侧的编辑区有个“添加”(open in editor编辑资源),我们首先需要添加前缀,比如我们将前缀取名为 images。然后选中这个前缀,继续点击添加文件,可以找到我们所需添加的文件。这里,我们选择 document-open.png 文件。当我们完成操作之后,Qt Creator 应该是这样子的:

接下来,我们还可以添加另外的前缀或者另外的文件。这取决于你的需要。当我们添加完成之后,我们可以像前面一章讲解的那样,通过使用 : 开头的路径来找到这个文件。比如,我们的前缀是 /images,文件是 document-open.png,那么就可以使用:/images/document-open.png找到这个文件。

这么做带来的一个问题是,如果以后我们要更改文件名,比如将 docuemnt-open.png 改成 docopen.png,那么,所有使用了这个名字的路径都需要修改。所以,更好的办法是,我们给这个文件去一个“别名”,以后就以这个别名来引用这个文件。具体做法是,选中这个文件,添加别名信息:

 这样,我们可以直接使用:/images/doc-open引用到这个资源,无需关心图片的真实文件名。

(5)代码实现:

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //ui->actionnew->setIcon(QIcon("E:/桌面文件/Image/Luffy.png"));
    //使用添加Qt资源  ": + 前缀名 + 文件名"
    ui->actionnew->setIcon(QIcon(":/new/prefix1/Image/butterfly.png"));

}

MainWindow::~MainWindow()
{
    delete ui;
}

二、对话框QDialog

1.自定义对话框:

        对话框分为模态对话框和非模态对话框。

        头文件     #include <QDialog>

(1)模态对话框,就是会阻塞同一应用程序中其它窗口的输入。

模态对话框很常见,比如“打开文件”功能。你可以尝试一下记事本的打开文件,当打开文件对话框出现时,我们是不能对除此对话框之外的窗口部分进行操作的。

    //点击新建按钮 弹出一个对话框
    connect(ui->actionnew,&QAction::triggered,[=](){
       //对话框  分类
       //模态对话框(不可以对其他窗口进行操作)  非模态对话框(可以对其他窗口进行操作)

       //模态创建   阻塞
       QDialog dlg(this);
       dlg.resize(200,100);
       dlg.exec();
       qDebug() <<"模态对话框弹出了";

       
    });

  (2)非模态对话框,例如查找对话框,我们可以在显示着查找对话框的同时,继续对记事本的内容进行编辑.

    //点击新建按钮 弹出一个对话框
    connect(ui->actionnew,&QAction::triggered,[=](){

        //非模态对话框
        QDialog * dlg2 = new QDialog(this);
        dlg2->resize(200,100);
        dlg2->show();
        qDebug() <<"非模态对话框弹出了";

    });

2. 标准对话框

所谓标准对话框,是 Qt 内置的一系列对话框,用于简化开发。事实上,有很多对话框都是通用的,比如打开文件、设置颜色、打印设置等。这些对话框在所有程序中几乎相同,因此没有必要在每一个程序中都自己实现这么一个对话框。

Qt 的内置对话框大致分为以下几类:

  1. QColorDialog:       选择颜色;
  2. QFileDialog:        选择文件或者目录;
  3. QFontDialog:        选择字体;
  4. QInputDialog:       允许用户输入一个值,并将其值返回;
  5. QMessageBox       模态对话框,用于显示信息、询问问题等;
  6. QPageSetupDialog:   为打印机提供纸张相关的选项;
  7. QPrintDialog:       打印机配置;
  8. QPrintPreviewDialog:打印预览;
  9. QProgressDialog:    显示操作过程

 (1)颜色对话框

头文件   #include <QColorDialog>

    //点击新建按钮 弹出一个对话框
    connect(ui->actionnew,&QAction::triggered,[=](){

        //颜色对话框
        QColor color = QColorDialog::getColor(QColor(255,0,0));
        qDebug() << "r = " << color.red() << "g = " << color.green() << "b = " << color.blue();
    });

 (2)文件对话框

   #include <QFileDialog>

    //点击新建按钮 弹出一个对话框
    connect(ui->actionnew,&QAction::triggered,[=](){

        //文件对话框   参数1   父亲    参数2   标题    参数3    默认打开路径    参数4   过滤文件格式
        //返回值是选取文件的路径
        QString str = QFileDialog::getOpenFileName(this,"打开文件","E:\\桌面文件","(*.txt)");
        qDebug() << str;
    });

 (3)字体对话框

   #include <QFontDialog>

    //点击新建按钮 弹出一个对话框
    connect(ui->actionnew,&QAction::triggered,[=](){
    bool flag;
    QFont font = QFontDialog::getFont(&flag,QFont("华文彩云",36));
    qDebug() << "字体:" << font.family() << "字号:" << font.pointSize() << "是否加粗" << font.bold() << "是否倾斜" << font.italic();
    });

 

3.消息对话框

QMessageBox用于显示消息提示。我们一般会使用其提供的几个 static 函数:

头文件 #include <QMessageBox>

(1)错误对话框

    //点击新建按钮 弹出一个对话框
    connect(ui->actionnew,&QAction::triggered,[=](){

        //消息对话框
        //错误对话框
        QMessageBox::critical(this,"critical","错误");

    });

(2)信息对话框

    //点击新建按钮 弹出一个对话框
    connect(ui->actionnew,&QAction::triggered,[=](){

        //消息对话框
        //信息对话框
        QMessageBox::information(this,"info","信息");

    });

 (3)问题对话框

    //点击新建按钮 弹出一个对话框
    connect(ui->actionnew,&QAction::triggered,[=](){

        //消息对话框
        //问题对话框
        //参数1  父亲   参数2   标题    参数3    提问内容  参数4    按键类型    参数5    默认关联回车按键
        if(QMessageBox::Save == QMessageBox::question(this,"ques","提问",QMessageBox::Save|QMessageBox::Cancel))
        {
            qDebug() << "选择的是保存";
        }
        else
        {
            qDebug() << "选择的是取消";
        }

    });

(4)警告对话框

    //点击新建按钮 弹出一个对话框
    connect(ui->actionnew,&QAction::triggered,[=](){

        //消息对话框
        //警告对话框
        QMessageBox::warning(this,"warning","警告");

    });

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1065919.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

asp.net闲置物品购物网系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net闲置物品购物网系统是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c#语 言开发 asp.net 闲置物品购物网 二、功…

2023年中国非晶纳米晶竞争格局、产业链及行业产量分析[图]

非晶合金又称“液态金属、金属玻璃”&#xff0c;是一种新型软磁合金材料&#xff0c;主要包含铁、硅、硼等元素。其主要制品非晶合金薄带的制造工艺是采用急速冷却技术将合金熔液以每秒106℃的速度急速冷却&#xff0c;形成厚度约0.03mm的非晶合金薄带&#xff0c;物理状态表现…

华为云ModelArts:引领AI艺术创作的未来,让人人都可以成为“艺术家”!

随着科技的飞速发展,艺术创作逐渐告别传统的画布和画笔,开始走向数字化、智能化的新时代。在这个蓬勃发展的领域中,华为云ModelArts以其强大的功能和出色的性能引领着AI艺术创作的未来。 华为云ModelArts是面向开发者的一站式AI开发平台,为机器学习与深度学习提供海量数据预处…

【STM32单片机】多功能电子密码锁设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用STM32F103C8T6单片机控制器&#xff0c;使用按键、IIC OLED模块、DS18B20温度传感器、SG90舵机、红外遥控、矩阵按键、EEPROM等。 主要功能&#xff1a; 系统运行后&#xff0c;OLED显示RTC日期…

【前段基础入门之】=>CSS3的新增特性!

文章目录 CSS3概述CSS3私有前缀常见浏览器私有前缀 新增盒模型相关属性怪异盒模型拖拽调整盒子大小盒子阴影不透明度 新增背景属性background-originbackground-clipbackground-size多背景图backgorund 复合属性 新增边框属性边框圆角边框外轮廓 新增文本属性文本阴影文本换行文…

用合成数据训练车辆姿态估计神经网络

我们的客户希望开发一款应用程序&#xff0c;引导用户通过 AR 指南和自动照片拍摄来拍摄更高质量的汽车照片。 本文重点介绍构建汽车姿态估计组件的技术。 在应用程序中&#xff0c;用户被引导站在与汽车一定的角度和距离&#xff0c;以标准化的方式捕捉最好的照片。 当用户处于…

1600*C. Good Subarrays(找规律前缀和)

Problem - 1398C - Codeforces 解析&#xff1a; 可以写出 sum[ j ] - sum[ i ] j - i 1&#xff0c;对其移项得 sum[ j ] - j sum[ i ] - &#xff08;i - 1&#xff09;&#xff0c;问题转换为有多少个前缀和相等&#xff0c;则用map遍历统计一遍即可。 注意&#xff0c;当…

QMC5883L-磁力计椭球拟合校准

1.概述 磁力计椭球拟合校准是一种将磁力计测量数据校准到真实磁场的技术。这种技术通常使用椭球模型来拟合磁力计的测量结果&#xff0c;然后通过最小二乘法来找到拟合参数的最优解。 2.总体思想 磁力计椭球拟合校准的思想包括以下几个步骤&#xff1a; 1.数据预处理&#x…

Java 21 新功能展示(含示例)

Java 21 于 2023 年 9 月 19 日发布&#xff0c;是 Oracle 标准 Java 实现的下一个长期支持&#xff08;LTS&#xff09;版本。Java 21 具有以下 15 项功能。 字符串模板&#xff08;预览版&#xff09; [JEP-430] 序列集合 [JEP-431] 代 ZGC [JEP-439&#xff3d; 记录模式…

Helm部署EMQX集群

端口说明&#xff1a; 端口说明集群内端口Nodeport备注mqtt188331274Port for MQTTmqttssl888331170Port for MQTT(SSL)mgmt8081无ws808330099Port for WebSocket/HTTPwss808432580Port for WSS/HTTPSdashboard1808331303Port for dashboard 一、Helm在线部署EMQX集群 1、安…

Compose输入框

TextField label设置提示内容&#xff0c;TextFieldDefaults.textFieldColors设置输入框背景颜色 TextField(modifier Modifier.fillMaxWidth().padding(5.dp),value text.value,onValueChange { text.value it },label { Text(text "请输入内容") },colors …

算法题:买卖股票的最佳时机 II

这道题是贪心算法的中级难度练习题&#xff0c;由于题目设定&#xff0c;整个价格都是透明的&#xff0c;这里并不涉及需要预测股票涨势的问题。解决思路不难&#xff0c;就是一旦股票价格开始下降了就买入&#xff0c;一旦上升了&#xff0c;就赶紧卖出。&#xff08;完整题目…

led护眼台灯对眼睛有伤害吗?推荐好用的led护眼台灯

其实led护眼台灯对眼睛伤害是不大的&#xff0c;而且和白炽灯、卤素灯等老式台灯相对比&#xff0c;反而更加护眼。因为白炽灯、卤素灯等光线都不太稳定&#xff0c;而且光线不是很均匀可以明显感觉有明暗差&#xff0c;最主要的是频闪现象会比较严重&#xff0c;长时间使用的话…

Apache Tomcat安装、运行

介绍 Apache Tomcat是下面多个规范的一个开源实现&#xff1a;Jakarta Servlet、Jakarta Server Pages、Jakarta Expression Language、Jakarta WebSocket、Jakarta Annotations 和 Jakarta Authentication。这些规范是 Jakarta EE 平台的一部分。 Jakarta EE 平台是Java EE平…

Vue Router的使用

使用 项目中注入路由器 在项目中 src 目录下新建 router 目录&#xff0c;其中包含 index.js 路由主文件。 // src/router/index.jsimport Vue from vue import Router from vue-router import { routes } from ./routes.jsVue.use(Router) const router new Router({route…

EPDB 08、EPDBS 10、PDRV、EPDZA06插装式比例减压阀放大器

比例方向阀W42E-5PS03、W43E-5PS05、W42E-1AS06、W43E-1AS06、插装式S22E-1V08放大器。 该放大器既可用于工业及移动设备应用&#xff0c;也可用于固定安装。因此&#xff0c;电压范围非常宽&#xff0c;在8至35VDC之间变化。这些放大器对欠压和电压尖峰非常不敏感&#xff0c…

浅谈时间流管理体系

不想聊技术&#xff0c;但又想分享一些东西&#xff0c;这篇文章分享下如何构造自己的时间流管理体系以及如何完整的把控一个事件安排统筹&#xff0c;这里对一个大型事件或大型知识体系如何分解为不同问题的小点不做点出&#xff0c;这里只提时间管理体系化。 好处的话也不做阐…

Nginx+Keepalived实现服务高可用

Nginx 和 Keepalived 是常用于构建高可用性&#xff08;High Availability&#xff09;架构的工具。Nginx 是一款高性能的Web服务器和反向代理服务器&#xff0c;而Keepalived则提供了对Nginx服务的健康状态监测和故障切换功能。 下载Nginx 在服务器1和服务器2分别下载nginx …

深入理解 python 虚拟机:原来虚拟机是这么实现闭包的

深入理解 python 虚拟机&#xff1a;原来虚拟机是这么实现闭包的 在本篇文章当中主要从虚拟机层面讨论函数闭包是如何实现的&#xff0c;当能够从设计者的层面去理解闭包就再也不用死记硬背一些闭包的概念了&#xff0c;因为如果你理解闭包的设计原理之后&#xff0c;这些都是…