Qt--多窗口编程

news2025/4/4 9:00:23

目录

1. QMessageBox 消息对话框(掌握)

示例代码:

dialog.h

dialog.cpp

dialog.ui

运行结果:

2. 窗口类继承关系

dialog.cpp

3. QMainWindow 主窗口类

3.1 QMenuBar 菜单栏

3.2 QToolBar 工具栏

3.3  QWidget 中心组件

3.4 QStatusBar 状态栏

示例代码:

mainwindow.h

mainwindow.cpp

mainwindow.ui

运行结果:

4. parent参数

示例代码:

dialog.h

dialog.cpp

dialog.ui

运行结果:

5. 自定义窗口类

示例代码:

dialog.h

dialog.cpp

运行结果:

6. 跨界面参数传递

6.1 主窗口→子窗口

示例代码:

mydialog.h

mydialog.cpp

dialog.h

dialog.cpp

6.2 子窗口→主窗口

示例代码:

mydialog.h

mydialog.cpp

dialog.h

dialog.cpp


1. QMessageBox 消息对话框(掌握)

QMessageBox继承自QDialog,是一种用于通知用户或询问用户一个问题的对话框窗口,这种窗口是模态的,会抢占窗口焦点,必须优先处理。

Qt内置的Dialog的派生类通常使用静态成员函数弹出:

// 参数1:父窗口
// 参数2:标题,相当于windowTitle属性
// 参数3:显示的信息
// 返回值:点击的按键类型
StandardButton QMessageBox::四种弹窗类型(QWidget * parent, 
                                       const QString & title, 
                                       const QString & text) [static]

示例代码:

dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include<QButtonGroup>
#include<QtWidgets>//包含所有组件和窗口 
#include<QDebug>

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();

private:
    Ui::Dialog *ui;
    QButtonGroup * group;
private slots:
    void btnsClickedSlot(int);//按钮组点击的槽函数
};

#endif // DIALOG_H

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
    group=new QButtonGroup(this);
    group->addButton(ui->pushButtonQ,1);
    group->addButton(ui->pushButtonI,2);
    group->addButton(ui->pushButtonW,3);
    group->addButton(ui->pushButtonC,4);
    connect(group,SIGNAL(buttonClicked(int)),this,SLOT(btnsClickedSlot(int)));
}
 void Dialog::btnsClickedSlot(int id)
 {
     //question(QWidget * parent, const QString & title, const QString & text)
     if(id==1)
     {
         QMessageBox::StandardButton result=QMessageBox::question(this,"question","今天吃饭吗?");//父窗口  标题 显示的信息
         if(result==QMessageBox::Yes)
             qDebug()<<"吃了!";
         else if(result==QMessageBox::No)
             qDebug()<<"没吃!";
     }
     else if(id==2)
         QMessageBox::information(this,"information","今天吃饭!");
     else if(id==3)
         QMessageBox::warning(this,"warning","一顿不吃饿的慌!");
     else if(id==4)
         QMessageBox::critical(this,"critical","顿顿不吃就得挂!");
 }

Dialog::~Dialog()
{
    delete group;
    delete ui;
}

dialog.ui

 

运行结果:

 

2. 窗口类继承关系

窗口类的继承关系如下所示。

QWidget类作为窗口和组件的基类,其内部定义了窗口和组件的基本功能,本节展示一部分作为窗口类的基类所拥有的API:

// 设置窗口状态
// 参数为窗口状态值
void QWidget::setWindowState(Qt::WindowStates windowState)

// 设置窗口标记
// 参数为窗口标记值,多个值之间可以使用|分割,以实际效果为准
void	setWindowFlags(Qt::WindowFlags type)

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
    // 设置全屏显示
    // setWindowState(Qt::WindowFullScreen);
    // 设置欢迎页效果
    setWindowFlags(Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint);
}

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

Esc键退出运行

QWidget类本身作为所有窗口和组件的基类,QWidget既可以作为窗口对象进行创建,又可以作为组件对象进行创建。

QWidget的构造函数的parent参数传递了一个窗口对象时,此时QWidget会成为这个窗口对象内部的组件。如果不传递此参数,QWidget对象会成为一个独立窗口。

3. QMainWindow 主窗口类

QMainWindow是最合适做主窗口的类型,因为它包含多个组成部分。

3.1 QMenuBar 菜单栏

菜单栏的组成部分如下所示。

QAction支持信号槽的连接,其信号函数如下。

除了在Designer中添加菜单栏和配置QAction的内容,也可以在C++代码中添加。

3.2 QToolBar 工具栏

当使用Action编辑器设置了QAction的图标后,可以直接拖拽到QToolBar变为工具栏按钮。

工具栏所有的操作也都可以在C++代码中找到对应API。

 

3.3  QWidget 中心组件

见本章第2节中QWidget作为组件使用时的说明。

3.4 QStatusBar 状态栏

状态栏主要用于显示软件的相关辅助信息,可以使用预设的样式(比较简单),也可以自定义样式。本次以预设的样式为例进行讲解。

主要的函数如下所示。

// 显示信息
// 参数1:信息内容
// 参数2:显示时长,单位毫秒,如果为0(默认值)表示持续显示
void QStatusBar::showMessage(const QString & message, int timeout = 0) [slot]
// 清空信息
void QStatusBar::clearMessage() [slot]

示例代码:

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
private slots:
    //QAction点击后触发的槽函数
    void triggeredSlot();
};

#endif // MAINWINDOW_H

mainwindow.cpp

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

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //连接信号槽
    connect(ui->actionOpen,SIGNAL(triggered()),this,SLOT(triggeredSlot()));
    // 设置状态栏内容
    ui->statusBar->showMessage("哈哈哈哈",3000);
}
void MainWindow::triggeredSlot()
{
    //设置效果
    ui->plainTextEdit->setPlainText("这是设置的内容");

}

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

mainwindow.ui

 

运行结果:

4. parent参数

几乎所有的Qt类的构造函数都有一个parent参数,实际上parent参数是Qt的一种内存管理策略。parent参数会作为新创建对象的父对象存在,当父对象销毁时,会一并销毁子对象。

建议在绝大多数情况下,传递parent参数,防止内存泄漏。

示例代码:

dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include<QDebug>

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();

private:
    Ui::Dialog *ui;
private slots:
    void btn1ClickedSlot();
    void btn2ClickedSlot();
};

#endif // DIALOG_H

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
    connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(btn1ClickedSlot()));
    connect(ui->pushButton_2,SIGNAL(clicked()),this,SLOT(btn2ClickedSlot()));
}
void Dialog::btn1ClickedSlot()
{
    Dialog *d=new Dialog(this);//父窗口关闭显示所有析构函数
    d->show();
}
void Dialog::btn2ClickedSlot()
{
    Dialog *d=new Dialog;//最后主窗口关闭显示一个析构函数
    d->show();
}
Dialog::~Dialog()
{
    qDebug()<<"析构函数";
    delete ui;
}


dialog.ui

 

运行结果:

点击传递parent函数,只有关闭主窗口,才会显示析构函数,否则不会显示。

点击不传递parent参数,只有关闭最后一个窗口才会显示析构函数

5. 自定义窗口类

截止到当前,Qt项目中从来没有完整地创建过一个自定义的窗口类,要么使用的是项目创建后自带的窗口类,要么使用Qt内置的窗口类QMessageBox。

在项目中创建一个Qt的自定义窗口类的操作步骤如下所示。

1. 在Qt Creator中选中项目名称,鼠标右键,点击“添加新文件”。

2. 在弹出的窗口中,按照下图所示进行操作。

3. 在弹出的窗口中选择窗口的模板样式后,点击“下一步”。

4. 在弹出的窗口中给类命名后,点击下一步。

5. 在项目管理界面点击“完成”。

示例代码:

dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
// 头文件
#include "mydialog.h"

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();

private:
    Ui::Dialog *ui;

private slots:
    void btnClickedSlot(); // 单击按钮的槽函数
};

#endif // DIALOG_H

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);

    // 连接信号槽
    connect(ui->pushButton,SIGNAL(clicked()),
            this,SLOT(btnClickedSlot()));
}

void Dialog::btnClickedSlot()
{
    // 创建并启动MyDialog窗口
    MyDialog* md = new MyDialog(this);
    md->show();
    // 屏蔽按钮
    ui->pushButton->setEnabled(false);
}

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

运行结果:

6. 跨界面参数传递

6.1 主窗口→子窗口

这种情况可以使用子窗口的构造函数/成员函数传参。

【例子】转动主窗口的QDial,使子窗口的QDial跟着一起转动。

示例代码:

mydialog.h

#ifndef MYDIALOG_H
#define MYDIALOG_H

#include <QDialog>

namespace Ui {
class MyDialog;
}

class MyDialog : public QDialog
{
    Q_OBJECT

public:
    //增加参数位
    explicit MyDialog(int,QWidget *parent = 0);
    ~MyDialog();
    //增加成员函数
    void setDialValue(int);
private:
    Ui::MyDialog *ui;
};

#endif // MYDIALOG_H

mydialog.cpp

#include "mydialog.h"
#include "ui_mydialog.h"

MyDialog::MyDialog(int value,QWidget *parent) :
    QDialog(parent),
    ui(new Ui::MyDialog)
{
    ui->setupUi(this);
    //设置QDial的初始值
    ui->dial->setValue(value);
}
void MyDialog::setDialValue(int value)
{
    //设置QDial的变化值
    ui->dial->setValue(value);
}

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

dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
//头文件
#include"mydialog.h"

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();

private:
    Ui::Dialog *ui;
    MyDialog * md;//创建子窗口
private slots:
    void btnClickedSlot();
    void valueChangedSlot(int);//QDial值变化的槽函数
};

#endif // DIALOG_H

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);

    connect(ui->pushButton,SIGNAL(clicked()),
            this,SLOT(btnClickedSlot()));
}
void Dialog::btnClickedSlot()
{
    //创建并启动MyDialog窗口
    //参数1:当前主窗口的QDial值
    md=new MyDialog(ui->dial->value(),this);
    connect(ui->dial,SIGNAL(valueChanged(int)),
            this,SLOT(valueChangedSlot(int)));
    md->show();
    //屏蔽按钮 只能创建一次子窗口
    ui->pushButton->setEnabled(false);
}
void Dialog::valueChangedSlot(int value)
{
   //给子窗口设定参数值
    md->setDialValue(value);
}

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

6.2 子窗口→主窗口

这种情况可以使用信号槽传参,子窗口发射带参数自定义信号给主窗口的槽函数接收。

【例子】转动子窗口的QDial,使主窗口的QDial跟着一起转动。

示例代码:

mydialog.h

#ifndef MYDIALOG_H
#define MYDIALOG_H

#include <QDialog>

namespace Ui {
class MyDialog;
}

class MyDialog : public QDialog
{
    Q_OBJECT

public:
    //增加参数位
    explicit MyDialog(QWidget *parent = 0);
    ~MyDialog();
private:
    Ui::MyDialog *ui;
private slots:
    //QDial转动的槽函数
    void valueChangedSlot(int);
signals:
    //带参数的自定义信号
    void valueSignal(int);
};

#endif // MYDIALOG_H

mydialog.cpp

#include "mydialog.h"
#include "ui_mydialog.h"

MyDialog::MyDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::MyDialog)
{
    ui->setupUi(this);
   connect(ui->dial,SIGNAL(valueChanged(int)),
           this,SLOT(valueChangedSlot(int)));
}
void MyDialog::valueChangedSlot(int value)
{
    //发送给主窗口
    emit valueSignal(value);
}

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

dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
//头文件
#include"mydialog.h"

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();

private:
    Ui::Dialog *ui;
private slots:
    void btnClickedSlot();//单击按钮的槽函数
    void valueSlot(int);//与子窗口中的自定义信号连接
};

#endif // DIALOG_H

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);

    connect(ui->pushButton,SIGNAL(clicked()),
            this,SLOT(btnClickedSlot()));
}
void Dialog::btnClickedSlot()
{
    //创建并启动MyDialog窗口
    MyDialog *md=new MyDialog(this);
    //建立两个窗口对象之间的槽函数
    connect(md,SIGNAL(valueSignal(int)),
            this,SLOT(valueSlot(int)));
    md->show();
    //屏蔽按钮
    ui->pushButton->setEnabled(false);
}
void Dialog::valueSlot(int value)
{
   //更新到组件上
    ui->dial->setValue(value);
}

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

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

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

相关文章

外强中干——双向带头循环链表

前言&#xff1a;众所周知&#xff0c;链表有八种结构&#xff0c;由单向或双向&#xff0c;有头或无头&#xff0c;循环或不循环构成。在本篇&#xff0c;将介绍8种链表结构中最复杂的——双向带头循环链表。听着名字或许挺唬人的&#xff0c;但实际上双向带头循环链表实现起来…

九盾安防智能叉车管理系统告诉你叉车电池安全使用的十要点

叉车电池是叉车的动力源&#xff0c;对于保证叉车安全运行具有非常重要的作用。但是&#xff0c;叉车电池在使用过程中也会存在一些安全问题&#xff0c;如果使用不当可能会引起严重后果。下文就九盾安防智能叉车管理系统介绍叉车电池安全使用的十要点。 一、保证通风良好。在使…

课程《JavaWeb基础框架程序设计》考试题下篇——数据库与表单操作用题(人事管理平台的添加员工档案信息的操作题)

文章目录 &#x1f4cb;前言&#x1f3af;第三题&#xff08;40分&#xff09;&#x1f3af;报错以及解决方法&#x1f4dd;最后 &#x1f4cb;前言 这篇文章是大学课程《JavaWeb基础框架程序设计》考试题目的内容&#xff0c;包括了原题和答案。题目只包括了三道编程题&#…

2直接连接的网络与VLAN划分-2.3【实验】【计算机网络】

2直接连接的网络与VLAN划分-2.2-2.3【实验】【计算机网络】 前言推荐2直接连接的网络与VLAN划分2.1共享式以太网和交换式以太网2.2交换机MAC地址表建立与帧转发2.3 STP工作过程实验目的实验内容及实验环境实验原理物理环路引发的问题1:广播风暴物理环路引发的问题2:MAC地址表翻…

ChatGPT之公文写作

公务文章主要适用于政府部门、机关、事业单位以及其他公共组织的文件、公告、通知等文稿。 根据《党政机关公文处理工作条例》&#xff0c;公文种类主要有15种。按照行文流向&#xff0c;可以分为上行文、平行文、下行文。 1、上行文&#xff1a;请示、报告、意见。 2、平行…

Qt 文件IO

目录 1. QFileDialog 文件选择对话框 示例代码 dialog.h dialog.cpp dialog.ui 运行效果&#xff1a; 2. QFileInfo 文件信息类 dialog.cpp 3. QFile 文件读写类 UI与耗时操作 QThread 线程类 1 复现阻塞 dialog.h dialog.cpp 2.新建并启动子线程 mythread.h mythread.cpp dial…

Py之tf2onnx:tf2onnx库的简介、安装、使用方法之详细攻略

Py之tf2onnx&#xff1a;tf2onnx库的简介、安装、使用方法之详细攻略 目录 tf2onnx库的简介 tf2onnx库的安装 tf2onnx库的使用方法 1、基础用法 tf2onnx库的简介 tf2onnx是一个将TensorFlow&#xff08;tf-1.x或tf-2.x&#xff09;、keras、tensorflow.js和tflite模型转换…

【python安装】linux环境安装python

linux环境安装python 小白都能看懂的python安装前置步骤下载python安装python 小白都能看懂的python安装 前置步骤 使用 python -V 或者 python -version 查看是否安装python如果Linux有python3需要更新指定版本的话&#xff0c;先把自带的删除&#xff0c;输入 rpm -qa|grep…

JavaScript通过js的方式来计算平行四边形的面积的代码

以下为通过js的方式来计算平行四边形的程序代码和运行截图 目录 前言 一、通过js的方式来计算平行四边形&#xff08;html部分&#xff09; 1.1 运行流程及思想 1.2 代码段 二、通过js的方式来计算平行四边形&#xff08;js部分&#xff09; 2.1 运行流程及思想 2.2 代码…

算法修炼之练气篇——练气六层

博主&#xff1a;命运之光 专栏&#xff1a;算法修炼之练气篇 前言&#xff1a;每天练习五道题&#xff0c;炼气篇大概会练习200道题左右&#xff0c;题目有C语言网上的题&#xff0c;也有洛谷上面的题&#xff0c;题目简单适合新手入门。&#xff08;代码都是命运之光自己写的…

算法修炼之练气篇——练气十七层

博主&#xff1a;命运之光 专栏&#xff1a;算法修炼之练气篇 前言&#xff1a;每天练习五道题&#xff0c;炼气篇大概会练习200道题左右&#xff0c;题目有C语言网上的题&#xff0c;也有洛谷上面的题&#xff0c;题目简单适合新手入门。&#xff08;代码都是命运之光自己写的…

SpringBoot+Token+Redis+Lua+自动续签极简分布式锁Token登录方案

前言 用SpringBoot做一个项目&#xff0c;都要写登录注册之类的方案 使用Cookie或Session的话&#xff0c;它是有状态的&#xff0c;不符合现代的技术 使用Security或者Shiro框架实现起来比较复杂&#xff0c;一般项目无需用那么复杂 使用JWT它虽然是无状态的&#xff0c;也可…

微信开发者之AppID和AppSecret举例子

-- 请不要为爱你的人流泪&#xff0c;因为爱你的人不会让你流泪&#xff01; 序 今天对这2东西做个相对全面的介绍&#xff0c;不一定深入&#xff0c;但是对实际开发还是很有必要的 我们在微信开发中总是会绕不开2个单词&#xff1a; AppID&#xff1a;开发者ID,有些叫AppK…

蓝桥杯题单day2【题目】

动态规划 调手表https://www.lanqiao.cn/problems/230/learning/?page1&first_category_id1&sortstudents_count&second_category_id3&tags%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92,%E5%9B%BD%E8%B5%9B 最优包含https://www.lanqiao.cn/problems/239/learning…

114.【Vue-细刷-05】

Vue-04 (二十八)、Vuex1.Vuex的简介(1).vuex是什么(2).什么时候使用Vuex(3).Vuex工作原理图 2.求和案列_纯Vue版本3.求和案列_Vuex(1).初始化状态(2).操作状态 4.求和案列_Vuex的getters(1).Vuex的getters类似于 Vue的computed 5.求和案列_Vuex中的mapSteat和mapGetters(1).靠自…

PY32F072 系列单片机,LQFP64, LQFP48, QFN32, LQFP32多种封装

PY32F072 系列微控制器采用高性能的 32 位 ARM Cortex-M0内核&#xff0c;宽电压工作范围的 MCU。嵌入高达 128Kbytes flash 和 16Kbytes SRAM 存储器&#xff0c;最高工作频率 72MHz。包含多种不同封装类型多款产品&#xff0c;LQFP64, LQFP48, QFN32, LQFP32。 PY32F072芯片…

C# 实现 Websocket通讯聊天 (管用、超好使,点个赞)

1、背景 WebSocket出现之前&#xff0c;Web端为了实现即时通讯&#xff0c;所用的技术都是Ajax轮询(polling)。轮询是在特定的的时间间隔&#xff08;如每1秒&#xff09;&#xff0c;由浏览器对服务器发出HTTP request&#xff0c;然后由服务器返回最新的数据给客服端的浏览器…

基于RV1126平台分类模型全流程部署(附工程)

基于RV1126平台分类模型全流程部署 环境安装模型训练ONNX模型转换RKNN模型转换可执行文件上板推理 环境安装 首先要在虚拟机上安装瑞芯微Rv1126的SDK&#xff0c;重要的是要具有rknn_toolchain 一般在以下路径&#xff1a; sdk/external/rknn-toolkit 按照doc里面的步骤安装即…

多模态:MiniGPT-4

多模态&#xff1a;MiniGPT-4 IntroductionMethodlimitation参考 Introduction GPT-4具有很好的多模态能力&#xff0c;但是不开源。大模型最近发展的也十分迅速&#xff0c;大模型的涌现能力可以很好的迁移到各类任务&#xff0c;于是作者猜想这种能力可不可以应用到多模态模…

物联网常见协议之 Amqp 协议及使用场景解析

引言 本文围绕 AMQP 协议&#xff0c;为大家详细解析 AMQP 协议、核心技术亮点、多协议之间的对比以及使用实践&#xff0c;并介绍华为云 IoT 通过 Amqp 协议如何为开发者和企业提供了更加灵活和高效的通信方式&#xff0c;使得物联网应用得以在各个领域得到更广泛的推广和应用…