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

news2025/1/21 4:56:41

前言:

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/1064062.html

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

相关文章

visual studio解决bug封装dll库

1.速度最大化 O2 2.设置输出目录 配置属性/常规/输出目录 链接器/常规/输出dll文件 链接器/调试/输出程序数据库pdb文件 链接器/高级/导入库 3.输出X86 X64分别对应的dll、lib、pdb 然后修改更新说明 更新说明格式如下&#xff1a; 4.将库提交到FTP每日更新库文档下 和测试交接…

运维/全栈必备Window指令

运维/全栈必备Window指令 前言 大家好 我是寸铁 除了Linux有常用的命令 Windows也有 下面让我们一起来看看吧! 总共是40个命令&#xff0c;按照前缀大致划分成25个命令。 便于系统学习和掌握。 需要用到的快捷键&#xff1a; 复制键&#xff1a; ctrl insert退出键&#x…

JTAG/SWD接口定义

目录 1. ST-Link接口定义 2. ULINK2接口定义 为方便查阅&#xff0c;将ST-LINK和ULINK的JTAG和SWD接口定义总结如下&#xff1a; 1. ST-Link接口定义 Pin no. ST-LINK/V2 connector (CN3) ST-LINK/V2 function Target connection (JTAG) Target connection (SWD) 1 VA…

Linux:环境变量、地址空间

目录 一、环境变量 1、什么是环境变量 2、常见的环境变量 3、环境变量相关命令 二、地址空间 1、进程地址空间 2、虚拟地址空间 一、环境变量 1、什么是环境变量 首先先举个环境变量的例子&#xff1a; 我们在Linux中&#xff0c;运行ls、pwd之类的命令&#xff0c;直…

RabbitMQ学习笔记(下):延迟队列,发布确认高级,备份交换机

十、延迟队列 延迟队列 概念&#xff1a; 延迟队列使用场景&#xff1a; 流程图&#xff1a; 延迟队列整合Springboot 导入依赖&#xff1a; <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot…

基于SSM的电脑硬件库存管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

物联网AI MicroPython传感器学习 之 IR人体红外传感器

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; 一、产品简介 热释电红外运动传感器能检测运动的人或动物身上发出的红外线&#xff0c;输出开关信号&#xff0c;可以应用于各种需要检测运动人体的场合。传统的热释电红外传感器需要人体热释电红外探头、专…

C++基础语法——unordered_map和unordered_set

1. unordered系列关联式容器 在C98中&#xff0c;STL提供了底层为红黑树结构的一系列关联式容器&#xff0c;在查询时效率可达到log(N)&#xff0c;即最差情况下需要比较红黑树的高度次&#xff0c;当树中的节点非常多时&#xff0c;查询效率也不理想。最好的查询是&#xff0c…

【16】c++设计模式——>建造者(生成器)模式

什么是建造者模式? 建造者模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;它允许你构造复杂对象步骤分解。你可以不同的步骤中使用不同的方式创建对象&#xff0c;且对象的创建与表示是分离的。这样&#xff0c;同样的构建过程可以创建不同的表…

python pygame入门 - 安装测试篇

pygame入门 - 安装篇 引言一、安装测试1.1 创建虚拟环境1.2 安装测试pygame 二、查看例程源码2.1 源码位置2.2 简单修改 引言 pygame是Python语言特别为游戏开发而设计的一个开源库。它提供了一系列模块和函数&#xff0c;可以帮助开发者快速构建2D游戏、多媒体应用程序和其他…

Electronjs入门-Electron中的主要模块

在本节中&#xff0c;我们将了解在Electron中创建任何应用程序时的一些基本模块&#xff1b;这些模块多种多样&#xff0c;使我们能够轻松地进行进程通信&#xff0c;创建操作系统的本地菜单。 为了利用Electron模块&#xff0c;以及任何第三方或Node模块&#xff0c;不仅在主流…

10.3倒水问题(几何图论建模)

坐标图中每一个位置都对应一个合法的状态&#xff0c;BC对5升杯子做出限制&#xff0c;AD对9升杯子作出限制 每次倒水&#xff0c;都只能把目标杯子装满&#xff0c;否则无法确定倒出水的多少与目标杯子此时水的容量 所以例如&#xff0c;倒5升杯子时&#xff0c;只能要么把5…

盘点网安最好入手的10大岗位,就业转行必看

前言 前段时间&#xff0c;知名机构麦可思研究院发布了《2022年中国本科生就业报告》&#xff0c;其中详细列出近五年的本科绿牌专业&#xff0c;信息安全位列第一。 对于网络安全的发展与就业前景已经说过很多&#xff0c;它是收入较高的岗位之一&#xff0c;在转行领域也占…

IO流 之 打印流( PrintStream 和 PrintWriter )

打印流可以实现更加方便的打印数据出去&#xff0c;可以实现打印啥就是啥 PrintStream字节打印流 代码演示&#xff0c;将字符串和其他类型&#xff0c;打印到f.txt文件中。 package day0927;import java.io.FileNotFoundException; import java.io.PrintStream; import java…

伟大不能被计划

假期清理书单&#xff0c;把这个书读完了&#xff0c;结果发现出奇的好&#xff0c;可以说是值得亲身去读的书&#xff0c;中间的一些论述提供了人工智能专业方面的视角来论证这这个通识观点&#xff0c;可信度很不错&#xff1b; 这篇blog也不是对书的总结&#xff0c;更多的是…

LLMs 奖励剥削 RLHF: Reward hacking

让我们回顾一下你到目前为止所学到的内容。RLHF是一个微调过程&#xff0c;用于使LLM与人类偏好保持一致。在这个过程中&#xff0c;您利用奖励模型来评估LLM对提示数据集的完成情况&#xff0c;根据人类偏好指标&#xff08;如有帮助或无帮助&#xff09;进行评估。 接下来&…

软件设计开发笔记6:基于QT的Modbus RTU从站

Modbus是一种常见的工业系统通讯协议。在我们的设计开发工作中经常使用到它。作为一种主从协议&#xff0c;在上一篇我们实现了Mobus RTU主站工具&#xff0c;接下来这一篇中我们将简单实现一个基于QT的Mobus RTU从站工具。 1、概述 Modbus RTU从站应用很常见&#xff0c;有一…

山西电力市场日前价格预测【2023-10-07】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-10-07&#xff09;山西电力市场全天平均日前电价为422.87元/MWh。其中&#xff0c;最高日前电价为1500.00元/MWh&#xff0c;预计出现在18: 15-18: 45。最低日前电价为221.56元/MWh&#x…

【JavaEE】_HTTP请求与HTTP响应

目录 1. HTTP协议 2. HTTP请求 2.1 HTTP请求首行 2.2 URL 2.3 HTTP方法 2.3.1 GET请求 2.3.2 POST请求 2.3.3 GET与POST的区别 2.3.4 其他方法 2.4 请求报头header 2.4.1 Host&#xff1a; 2.4.2 Content-Length与Content-Type&#xff1a; 2.4.3 User-Agent&…