C++客户端Qt开发——Qt窗口(对话框)

5.对话框

①对话框介绍

对话框是GUI程序中不可或缺的组成部分。一些不适合在主窗口实现的功能组件可以设置在对话框中。对话框通常是一个顶层窗口,出现在程序最上层,用于实现短期任务或者简洁的用户交互。Qt常用的内置对话框有:QFiledialog(文件对话框)QColorDialog(颜色对话框)QFontDialog(字体对话框)QInputDialog(输入对话框)QMessageBox(消息框)

1>点击按钮弹出一个Dialog窗口

创建项目的时候还是在QMainWindow

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QDialog>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);}MainWindow::~MainWindow()
{delete ui;
}//不同于界面上的其他控件.此处QDialog每次按下按钮,都会创建一个新的QDialog对象,并进行显示
//每次点击都会创建新的对话框对象--->可能导致内存泄漏,尤其是内存剩余很少的时候
void MainWindow::on_pushButton_clicked()
{QDialog* dialog = new QDialog(this);dialog->setWindowTitle("(Dialog)");dialog->resize(400,300);dialog->show();//为解决内存泄漏问题,QDialog有一个属性可以使关闭按钮与delete关联起来dialog->setAttribute(Qt::WA_DeleteOnClose);
}
2>自定义对话框

(1)用代码的方式创建

创建好MainWindow的项目后,添加按钮并转到槽clicked,然后新建C++->classclass name:Dialog继承父类:QDialog,建好以后,在dialog.h中加上头文件#include<Dialog>,在mainwindow.cpp中加入头文件#include"dialog.h"

new了一个Dialog后一般是手动释放,不用加在对象树中,但是如果要加也可以。

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include"dialog.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_clicked()
{//这是是Dialog类而不是QDialog类,因为此处要用自己定义的classDialog* dialog = new Dialog(this); //如果要指定父窗口,就要加thisdialog->resize(400,300);dialog->setAttribute(Qt::WA_DeleteOnClose);dialog->show();
}
#ifndef DIALOG_H
#define DIALOG_H
#include<QDialog>#include <QWidget>class Dialog : public QDialog
{Q_OBJECT
public:Dialog(QWidget* parent);void handle();
};#endif // DIALOG_H
#include "dialog.h"
#include<QPushButton>
#include<QLabel>
#include<QVBoxLayout>Dialog::Dialog(QWidget* parent):QDialog(parent)
{QVBoxLayout* layout = new QVBoxLayout();this->setLayout(layout);QLabel* label = new QLabel("这是一个对话框",this);QPushButton* pushbtn = new QPushButton("关闭",this);layout->addWidget(label);layout->addWidget(pushbtn);connect(pushbtn,&QPushButton::clicked,this,&Dialog::handle);
}void Dialog::handle()
{this->close();
}

(2)用图形化界面创建

创建好MainWindow的项目后,添加按钮并转到槽clicked,然后新建Qt->Qt设计师界面类(创建.ui文件以及对应的类),根据情况选择模板(此处对话框选择Dialog without Buttons),然后下一步完成。

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include"dialog.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_clicked()
{Dialog* dialog = new Dialog();dialog->setAttribute(Qt::WA_DeleteOnClose);dialog->show();}
#include "dialog.h"
#include "ui_dialog.h"Dialog::Dialog(QWidget *parent) :QDialog(parent),ui(new Ui::Dialog)
{ui->setupUi(this);
}Dialog::~Dialog()
{delete ui;
}void Dialog::on_pushButton_clicked()
{this->close();
}

②对话框分类

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

模态:弹出对话框的时候此时用户无法操作父窗口,必须得完成对话框内部出的操作,关闭对话框之后

模态展示方法是exec()

非模态:弹出对话框的时候,用户可以操作父窗口

非模态展示方法是show()

还有时候会使用混合属性对话框

混合属性对话框同时具有模态对话框和非模态对话框的属性,对话框的生成和销毁具有非模态对话框属性功能上具有模态对话框的属性

使用QDialog:setModal()函数可以创建混合特性的对话框。通常,创建对话框时需要指定对话框的父组件。

③Qt内置对话框

Qt提供了多种可复用的对话框类型,即Qt标准对话框。Qt标准对话框全部继承于QDialog类。常用标准对话框如下:

(1)消息对话框 QMessageBox
1>自定义对话框按钮

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QMessageBox>
#include<QPushButton>
#include<QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_clicked()
{//创建QMessageBoxQMessageBox* messagebox = new QMessageBox();messagebox->setWindowTitle("标题");messagebox->setText("这是对话框的文本");messagebox->setIcon(QMessageBox::Warning);//标准按钮messagebox->setStandardButtons(QMessageBox::Ok | QMessageBox::Save | QMessageBox::Cancel);//自定义按钮
//    QPushButton* pushbtn = new QPushButton("按钮");
//    messagebox->addButton(pushbtn,QMessageBox::AcceptRole);//也可以connect连接信号槽,来针对当前点击的按钮进行一些相关操作//用户点击按钮,使对话框关闭以后,此时就能通过exec的返回值,来知道用户点击的哪个按钮,从而执行对应逻辑int result = messagebox->exec();if(result == QMessageBox::Ok){qDebug()<<"Ok";}else if(result == QMessageBox::Save){qDebug()<<"Save";}else if(result == QMessageBox::Cancel){qDebug()<<"Cancel";}messagebox->setAttribute(Qt::WA_DeleteOnClose);}
2>快速创建对话框

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QMessageBox>
#include<QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_clicked()
{//快速创建对话框//warning类型int result = QMessageBox::warning(this,"对话框warning","对话框文本",QMessageBox::Ok,QMessageBox::Cancel);//critical类型//int result = QMessageBox::critical(this,"对话框critical","对话框文本",QMessageBox::Ok,QMessageBox::Cancel);//information类型//int result = QMessageBox::information(this,"对话框information","对话框文本",QMessageBox::Ok,QMessageBox::Cancel);if(result == QMessageBox::Ok){qDebug()<<"Ok";}else if(result == QMessageBox::Cancel){qDebug()<<"Cancel";}
}

可以设置的按钮的类型

(2)颜色对话框 QColorDialog

getColor这个函数能够弹出一个模态对话框,用户选择颜色以后,点击确定,对话框关闭,getColor返回的值就是用户选择的颜色值

这是一个静态函数,不必创建对话框对象就可以使用

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QColorDialog>
#include<QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_clicked()
{
//    QColorDialog* dialog = new QColorDialog(this);
//    dialog->exec();
//    delete dialog;QColor color = QColorDialog::getColor(QColor(0,255,0),this,"选择颜色");qDebug() << color;//可以基于用户选择的颜色,修改窗口的颜色或者背景色
//    QString style = "background-color:rgb(" + QString::number(color.red()) + "," + QString::number(color.green())
//            + "," + QString::number(color.blue()) + ")";//用下面这种方式替换上述代码,更直观char style[1024] = {0};sprintf(style,"background-color:rgb(%d,%d,%d);",color.red(),color.green(),color.blue());//将选定的颜色设置到配置项中this->setStyleSheet(style);
}

常用方法介绍:

  1. QColorDialog(QWidget*parent=nullptr):创建对象的同时设置父对象
  2. QColorDialog(const QColor&initial,QWidget*parent=nullptr):创建对象的同时通过QColor对象设置默认颜色和父对象
  3. void setCurrentColor(const QColor&color):设置当前颜色对话框
  4. QColor currentColor() const:获取当前颜色对话框
  5. QColor getColor(const QColor &initial Qt::white,QWidget *parent nullptr,const QString&title QString(),QColorDialog::ColorDialogOptions options ColorDialogOptions()):打开颜色选择对话框,并返回一个QColor对象
  6. void open(QObject*receiver,const char*member)打开颜色对话框

参数说明:

initial:设置默认颜色

parent:设置父对象

title:设置对话框标题

options:设置选项

(3)文件对话框 QFileDialog

文件对话框用于应用程序中需要打开一个外部文件或需要将当前内容存储到指定的外部文件。

常用方法介绍:

打开文件(一次只能打开一个文件):QString getopenFileName

打开多个文件(一次可以打开多个文件):QStringList getopenFileNames

保存文件:QString getSaveFileName

参数说明:

参数1:parent父亲

参数2:caption对话框标题

参数3:dir默认打开的路径

参数4:filter文件过滤器

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QFileDialog>
#include<QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_clicked()
{QString filePath = QFileDialog::getOpenFileName(this);qDebug() << filePath;
}void MainWindow::on_pushButton_2_clicked()
{QString filePath = QFileDialog::getSaveFileName(this);qDebug() << filePath;
}
(4)字体对话框 QFontDialog

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QFontDialog>
#include<QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_clicked()
{//光标放在函数上按F1打开帮助文档bool ok = false;QFont font = QFontDialog::getFont(&ok);qDebug() << "ok = " << ok;
//    qDebug() << font;qDebug() << font.family();//字体qDebug() << font.pointSize();//字号qDebug() << font.bold();//加粗qDebug() << font.italic();//倾斜ui->pushButton->setFont(font);
}
(5)输入对话框

让用户输入一个具体的数据,可以是整数、浮点数、字符串(类似于下拉框)

常用方法:

  1. 双精度浮点型输入数据对话框:double getDouble
  2. 整形输入数据对话框:int getInt
  3. 选择条目行输入数据框:QString getltem

参数说明:

parent:父亲

title:对话框标题

label:对话框标签

items:可供选择的条目

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QInputDialog>
#include<QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_clicked()
{int result = QInputDialog::getInt(this,"整数输入对话框","请输入一个整数:");qDebug()<<result;
}void MainWindow::on_pushButton_2_clicked()
{double result = QInputDialog::getDouble(this,"整数输入对话框","请输入一个浮点数:");qDebug()<<result;
}void MainWindow::on_pushButton_3_clicked()
{QStringList items;items.push_back("111");items.push_back("222");items.push_back("333");items.push_back("444");QString item = QInputDialog::getItem(this,"整数输入对话框","请输入条目:",items);qDebug()<<item;
}

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

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

相关文章

【第四天】计算机网络知识 HTTP1.0,HTTP1.1与HTTP2.0的区别 HTTP3.0

HTTP1.0&#xff0c;HTTP1.1与HTTP2.0的区别 HTTP1.0 默认是短链接&#xff0c;可以强制开启长连接。HTTP1.1默认长连接。HTTP2.0采用多路复用。 HTTP1.0&#xff1a; 默认使用短链接&#xff0c;每次请求都需要建立一个TCP连接。它可以设置&#xff1a;Connection: keep-aliv…

利用OSMnx求路网最短路径并可视化(二)

书接上回&#xff0c;为了增加多路径的可视化效果和坐标匹配最近点来实现最短路可视化&#xff0c;我们使用图形化工具matplotlib结合OSMnx的绘图功能来展示整个路网图&#xff0c;并特别高亮显示计算出的最短路径。 多起终点最短路路径并计算距离和时间 完整代码#运行环境 P…

洛谷 P9854 [CCC 2008 J1] Body Mass Index

这题让我们计算出 BMI 值&#xff0c;随后判断属于哪个等级。 BMI 值计算公式&#xff1a; ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​。 BMI 范围 对应信息 …

【JVM基础08】——类加载器-说一下类加载的执行过程?

目录 1- 引言&#xff1a;类加载的执行过程1-1 类加载的执行过程是什么&#xff1f;(What) 2- ⭐核心&#xff1a;详解类加载的执行过程(How)2-1 加载——>加载到运行时数据区2-2 验证——>类的安全性检查2-3 准备——>为类变量分配内存并设置初始值2-4 解析——>把…

Web网页端IM产品RainbowChat-Web的v7.1版已发布

一、关于RainbowChat-Web RainbowChat-Web是一套Web网页端IM系统&#xff0c;是RainbowChat的姊妹系统&#xff08;RainbowChat是一套基于开源IM聊天框架 MobileIMSDK (Github地址) 的产品级移动端IM系统&#xff09;。 ► 详细介绍&#xff1a;http://www.52im.net/thread-2…

每天一个设计模式之职责链模式(第一天)

特别感谢刘伟老师&#xff0c;看他的书我学到了很多东西&#xff0c;从今天开始我要开始更新啦&#xff01; 在csdn个人博客来总结知识&#xff0c;把他们变成自己的能力。 对三&#xff0c;要不起&#xff0c;张三李四王五几个人在玩斗地主&#xff0c;过过过&#xff0c;一…

Codeforces Round 962 (Div. 3)

链接 C题&#xff1a; 思路&#xff1a; 直接暴力求每个字母的前缀和&#xff0c;对于区间l&#xff0c;r的最小操作就是区间不同数的一半&#xff0c;因为可以把一个数变成另一个不一样的数&#xff0c;一下抵消两个。 #include<bits/stdc.h> using namespace std; //…

MySQL中不等于筛选时会漏掉null值的问题

一、问题描述 MySQL中使用不等于进行筛选数据时&#xff0c;若筛选值为null&#xff0c;则该条数据不会被选中&#xff0c;如何解决该问题&#xff1f; 表示不等于的方式如下&#xff1a; ! <> not in二、案例验证 1、创建数据表 -- ---------------------------- -…

【2024最新版】Stable diffusion汉化版安装教程(附SD安装包),一键激活,永久免费!

目前广泛使用的Stable Diffusion Web UI简称(SDWebUI)是发布在开源平台Github上的一个Python项目,与通常的软件安装方法不同,这个项目并不是下载并安装即可使用的应用程序,而是需要准备执行环境,编译源码. 如果你是一个新手不会安装,现在可以直接使用一键启动包. 例如:国内的…

AI驱动的在线面试系统:技术革新与初步面试的新体验

一、引言 在数字化和智能化的时代背景下&#xff0c;人工智能&#xff08;AI&#xff09;技术正日益渗透到各行各业&#xff0c;为人们的生活和工作带来前所未有的变革。其中&#xff0c;AI驱动的在线面试系统&#xff0c;凭借其高效、便捷、公正等特性&#xff0c;逐渐成为企业…

ATF-541M4全解析(一)

目录 一、描述二、规格三、各参数最大值四、25℃下的典型值 一、描述 安华高科技 (Avago Technologies) 的 ATF-541M4 是一款高线性度、低噪声、单电源供电的E-PHEMT&#xff0c;封装在一个微型无引脚封装中。 ATF-541M4 的小尺寸和低外形使其非常适合用于混合模块和其他空间…

matplotlib 画图函数,最常用的

并排显示2个图片 import os import numpy as np from PIL import Image import matplotlib.pyplot as pltimage1 Image.open(a.png) image2 Image.open(a2.png)# Create a figure with two subplots (1 row, 2 columns) fig, axes plt.subplots(1, 2, figsize(10, 5))# Di…

【Git-驯化】一文搞懂git中rm命令的使用技巧

【Git-驯化】一文搞懂git中rm命令的使用技巧 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 免费获取相关内容文档关注&#xff1a;微信公…

git学习笔记(总结了常见命令与学习中遇到的问题和解决方法)

前言 最近学习完git&#xff0c;学习过程中也遇到了很多问题&#xff0c;这里给大家写一篇总结性的博客&#xff0c;主要大概讲述git命令和部分难点问题&#xff08;简单的知识点这里就不再重复讲解了&#xff09; 一.git概述 1.1什么是git Git是一个分布式的版本控制软件。…

【推研小灶】复旦与南大之间:一次独特的计算机保研之旅

写在前面 上午10点填完志愿等待复试通知&#xff0c;利用这段时间记录一下我简短的夏令营和预推免。今年变为线下之后&#xff0c;部分学校的入营情况、考核方式有明显变化。加上CS方向保研名额总体变多&#xff0c;形势有点小乱&#xff0c;甚至填报系统都在9.29中秋节当天&a…

嵌入式C++、Raspberry Pi、LoRa和Wi-Fi技术、TensorFlow、ROS/ROS2:农业巡检数据导航机器人设计流程(代码示例)

随着科技的不断进步&#xff0c;农业领域也在逐渐向智能化发展。农业巡检机器人作为农业智能化的重要组成部分&#xff0c;能够自动化地监测农作物生长状况&#xff0c;提高农业管理的效率和精确度。本文将介绍一个基于Raspberry Pi和NVIDIA Jetson的农业巡检机器人&#xff0c…

【我的养猪日记】区块链游戏

剧情介绍 年少无知留给了故乡&#xff0c;谦卑有礼送给了远方&#xff0c;有工作的地方没家&#xff0c;有家的地方没工作&#xff0c;他乡留不下灵魂&#xff0c;故乡安不了肉身&#xff0c;从此便有了漂泊。在外漂泊数年的你每天过着&#xff0c;挤不完的公交地铁、交不完的房…

VUE3学习第三篇:报错记录

1、在我整理好前端代码框架后&#xff0c;而且也启动好了对应的后台服务&#xff0c;访问页面&#xff0c;正常。 2、报错ReferenceError: defineModel is not defined 学到这里报错了 在vue网站的演练场&#xff0c;使用没问题 但是在我自己的代码里就出问题了 3、watchEffec…

网友提问:桌面与web开发哪个难度更大?

关于桌面应用开发与Web开发哪个难度更大的问题&#xff0c;实际上并没有绝对的答案&#xff0c;因为这取决于具体的开发任务、所使用的工具和技术栈等因素。不过&#xff0c;我们可以从几个方面来进行比较&#xff1a; 技术栈 Web开发&#xff1a; 前端通常涉及到HTML、CSS、J…

用Python编写自动答题脚本——该如何写呢?

编写一个Python自动答题脚本的复杂性和方法将取决于你所要答题的系统的具体实现和限制。以下是一个简化的流程&#xff0c;以及如何在不同情境下编写自动答题脚本的基本思路。 1. 确定答题系统的交互方式 首先&#xff0c;你需要了解答题系统是如何与用户交互的。这可能包括&…