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

news2024/9/20 8:00:25

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类,因为此处要用自己定义的class
    Dialog* dialog = new Dialog(this); //如果要指定父窗口,就要加this
    dialog->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()
{
    //创建QMessageBox
    QMessageBox* 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.coloradmin.cn/o/1952200.html

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

相关文章

【NLP自然语言处理】为什么说BERT是bidirectional

首先&#xff0c;来看一下Transformer架构图&#xff1a; 我们知道&#xff0c;Bert设计时主要采用的是Transformer编码器部分&#xff0c;要论述Bert为啥是双向的&#xff0c;我想从编码器和解码器的注意力机制来阐述。 在看这篇博客前&#xff0c;需要对Transformer有一定的…

如何录制电脑内部声音?全方位介绍电脑录音软件:8款在线录音!(2024重新整理)

如何录制电脑内部声音&#xff1f;不管是娱乐圈还是现实生活&#xff0c;【录音】这个功能的重要性不言而喻。而电脑录音已在影视配音、音视频剪辑、会议记录、在线教育等多个领域发光发热&#xff01; 本文将为您推荐8款电脑录音软件&#xff0c;并详细介绍电脑录音的多种方式…

【Windows和Linux校验文件MD5值(详细)】

1、 什么是MD5&#xff1f; 文件的MD5校验是一种常用的文件完整性验证方法。MD5&#xff08;Message Digest Algorithm 5&#xff09;是一种广泛应用的哈希算法&#xff0c;它能够将任意长度的数据转换为固定长度的哈希值。在文件校验中&#xff0c;MD5算法通过计算文件的哈希…

访问所有节点的最短路径

847. 访问所有节点的最短路径 存在一个由 n 个节点组成的无向连通图&#xff0c;图中的节点按从 0 到 n - 1 编号。 给你一个数组 graph 表示这个图。其中&#xff0c;graph[i] 是一个列表&#xff0c;由所有与节点 i 直接相连的节点组成。 返回能够访问所有节点的最短路径的…

【吊打面试官系列-Dubbo面试题】服务调用是阻塞的吗?

大家好&#xff0c;我是锋哥。今天分享关于 【服务调用是阻塞的吗&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 服务调用是阻塞的吗&#xff1f; 默认是阻塞的&#xff0c;可以异步调用&#xff0c;没有返回值的可以这么做。 Dubbo 是基于 NIO 的非阻塞实现…

渗透测试:筑牢网络安全的坚固防线

在当今这个互联网高度发达的时代&#xff0c;网络安全已成为维护社会稳定和经济发展的重要基石。随着互联网的普及&#xff0c;网络攻击手段日益复杂多变&#xff0c;各类安全威胁层出不穷。为了有效应对这些挑战&#xff0c;渗透测试作为一种重要的安全测试与评估方法&#xf…

QT自定义无边框窗口(可移动控制和窗口大小调整)

QT是一个功能强大的跨平台开发框架&#xff0c;它提供了丰富的界面设计工具和组件。在界面开发中&#xff0c;QT窗口自带的标题栏无法满足我们的需求。我们就需要自定义无边框窗口&#xff0c;包括自定义标题栏和窗口大小调整功能。本文将介绍如何在QT中实现这些功能。 一、简…

AI绘画入门实践 | Midjourney:使用 --chaos 给图像风格来点惊喜

在 Midjourney 中&#xff0c;--chaos 影响初始图像网格的多样性&#xff0c;指 MJ 每次出的4张图之间的差异性。 默认值为0&#xff0c;值越高&#xff0c;差异性越大。 使用格式&#xff1a;--chaos 0-100的整数值 使用演示 a lot of flowers --chaos 0 --v 6.0a lot of fl…

基于微信小程序+SpringBoot+Vue的垃圾分类系统(带1w+文档)

基于微信小程序SpringBootVue的垃圾分类系统(带1w文档) 基于微信小程序SpringBootVue的垃圾分类系统(带1w文档) 本垃圾分类小程序也是紧跟科学技术的发展&#xff0c;运用当今一流的软件技术实现软件系统的开发&#xff0c;让环保方面的信息完全通过管理系统实现科学化&#xf…

3.5 查找和排序算法

大纲 算法基础 常用的表示算法的方法 算法的复杂度 查找 顺序查找、二分查找 哈希查找 真题 排序 插入排序 希尔排序 简单选择排序 堆排序 冒泡排序 快速排序 归并排序 基数排序 排序算法总结 真题

【数据结构】双向带头循环链表(c语言)(附源码)

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;数据结构 目录 前言 1.双向带头循环链表的概念和结构定义 2.双向带头循环链表的实现 2.1 方法声明 2.2 方法实现 2.2.1 创建新节点 2.2.2 初始化 2.2.3 …

C# 写入SQLServer数据库报错SqlException: 不能将值 NULL 插入列 ‘ID‘

private int id; [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)]//id自增 public int ID { get > id; set > id value; } 将ID属性下的标识规范由否改成是

WebLogic 9.x 10.x中间件监控指标解读

监控易是一款功能强大的IT系统监控软件&#xff0c;能够实时监控包括WebLogic中间件在内的各类应用和业务运行状态。对于WebLogic 9.x和10.x版本的监控&#xff0c;监控易提供了一系列详尽的指标&#xff0c;确保用户能够全面了解和掌握WebLogic集群和应用的性能状况。 在WebLo…

2024年国际高校数学建模竞赛问题B:空间迁移计划和战略完整思路 模型 代码 结果分享(仅供学习)

2024年国际高校数学建模竞赛问题B&#xff1a;空间迁移计划和战略&#xff08;2024 International Mathematics Molding Contest for Higher Education (IMMCHE)Problem B: Space Migration Program and Strategy&#xff09; 我们的未来有两种可能性:第一&#xff0c;我们将留…

目标检测自顶向下入门

最近在学习Yolo和OpenCV这些计算机视觉的相关领域&#xff0c;把深度学习啃了个大概&#xff0c;准备着手学习一下Yolov5&#xff0c;趁着这个机会入门一下目标检测这个领域&#xff0c;也算是自顶向下地学习一遍吧。 目标检测 什么是目标检测 物体识别&#xff08;Object de…

JavaScript(16)——定时器-间歇函数

开启定时器 setInterval(函数,间隔时间) 作用&#xff1a;每隔一段时间调用这个函数&#xff0c;时间单位是毫秒 例如&#xff1a;每一秒打印一个hello setInterval(function () { document.write(hello ) }, 1000) 注&#xff1a;如果是具名函数的话不能加小括号&#xf…

算法板子:使用数组模拟双链表——初始化链表、插入结点、删除结点

插入操作的指针修改顺序&#xff1a; 代码&#xff1a; #include <iostream> using namespace std;const int N 1e5 10;// e[i]代表i结点的值; l[i]代表i结点左边结点的下标; r[i]代表i结点右边结点的下标; idx代表当前可用结点的下标 int e[N], l[N], r[N], idx;// 初…

一刷代码随想录(回溯4)

递增子序列 题意&#xff1a; 给定一个整型数组, 你的任务是找到所有该数组的递增子序列&#xff0c;递增子序列的长度至少是2。 示例: 输入: [4, 6, 7, 7]输出: [[4, 6], [4, 7], [4, 6, 7], [4, 6, 7, 7], [6, 7], [6, 7, 7], [7,7], [4,7,7]] 说明: 给定数组的长度不会…

vue3里将table表格中的数据导出为excel

想要实现前端对表格中的数据进行导出&#xff0c;这里推荐使用xlsx这个依赖库实现。 1、安装 pnpm install xlsx 2、使用 import * as XLSX from "xlsx"; 直接在组件里导入XLSX库&#xff0c;然后给表格table通过ref创建响应式数据拿到table实例&#xff0c;将实…

多机构发布智能锁2024半年报:德施曼上半年线上全渠道销额稳居第一

近日&#xff0c;权威机构奥维云网、洛图科技先后发布智能门锁2024半年报&#xff0c;报告均指出上半年中国智能门锁线上渠道持续增长。奥维云网数据显示&#xff0c;2024上半年线上渠道销量同比增长22.7%&#xff0c;成行业增长最快的部分&#xff1b;洛图科技强调&#xff0c…