Qt 5.14.2 学习记录 —— 십팔 对话框

news2025/1/23 6:40:05

文章目录

  • 1、Qt对话框
  • 2、自定义对话框
    • 1、代码方式
    • 2、图形化方式
  • 3、模态对话框
  • 4、QMessageBox
  • 5、QColorDialog
  • 6、QFileDialog
  • 7、QFontDialog
  • 8、QInputDialog


1、Qt对话框

Qt的对话框用QDialog类来表示,可以自定义一些类来实现自定义对话框,但需要继承自QDialog。

常用对话框:

QFiledialog(文件对话框)、QColorDialog(颜色对话框)
QFontDialog(字体对话框)、QInputDialog (输入对话框)、 QMessageBox(消息框)

创建一个Dialog项目

在这里插入图片描述
在这里插入图片描述

主窗口通常不作为对话框,而是再创建对话框。

写一个常见的对话框逻辑

// 放一个按钮到界面中
void Dialog::on_pushButton_clicked()
{
    QDialog* dialog = new QDialog(this);
    dialog->setWindowTitle("标题");
    dialog->resize(400, 700);
    dialog->show();
}

因为继承自QWidget,所以用的方法也都一样。不过现在的代码肯定不行,因为每次点击都要new一个,这是一个漏洞。如果在槽函数里最后加上delete dialog,那么点击按钮后,对话框就会出现一下就消失。应该在用户点击对话框叉号的时候再关闭对话框,这方面是Qt内部自动做好的。

2、自定义对话框

1、代码方式

新建一个mainwindow项目,在这个项目下创建C++类

在这里插入图片描述
在这里插入图片描述

// dialog.h
#include <QWidget>
#include <QDialog>

class Dialog : public QDialog
{
    Q_OBJECT
public:
    Dialog(QWidget* parent);

    void handle();
};

// dialog.cpp
#include "dialog.h"
#include <QLabel>
#include <QPushButton>
#include <QVBoxLayout>

Dialog::Dialog(QWidget* parent) : QDialog(parent)
{
    // 创建控件加入到Dialog中
    QVBoxLayout* layout = new QVBoxLayout();
    this->setLayout(layout);

    QLabel* label = new QLabel("Label文本", this);
    QPushButton* button = new QPushButton("关闭", this);
    layout->addWidget(label);
    layout->addWidget(button);

    connect(button, &QPushButton::clicked, this, &Dialog::handle);
}

void Dialog::handle()
{
    this->close();
}

// mainwindow.cpp
#include "dialog.h"

void MainWindow::on_pushButton_clicked()
{
    // 括号可以加this, 加到对象树上, 这样dialog的h和cpp文件就写上对应的参数
    // 由于我们要手动释放, 所以不加this也可以
    Dialog* dialog = new Dialog(this);
    dialog->resize(300, 300);
    dialog->setAttribute(Qt::WA_DeleteOnClose);
    dialog->show();
}

2、图形化方式

需要再创建一个ui文件

在这里插入图片描述
在这里插入图片描述

类名可以用自动生成的

在这里插入图片描述

对于对话框ui文件,放一个label和一个按钮

在这里插入图片描述

转到主窗口的按钮的槽函数,这样写

// mainwin.cpp
void MainWindow::on_pushButton_clicked()
{
    Dialog* dialog = new Dialog(this);
    dialog->setAttribute(Qt::WA_DeleteOnClose);
    dialog->show();
}

// dialog.cpp
void Dialog::on_pushButton_clicked()
{
    this->close();
}

3、模态对话框

模态的意思是当弹出该对话框时,必须完成对话框内的操作,关闭对话框后才能操作父窗口;非模态则反之,出现对话框后也能继续操作父窗口。

上面的代码都是非模态的,要写成模态,把show改成exec即可。

4、QMessageBox

消息对话框

创建一个MainWindow项目,在界面中放一个按钮

#include <QMessageBox>

void MainWindow::on_pushButton_clicked()
{
    QMessageBox* messageBox = new QMessageBox(this);
    messageBox->setWindowTitle("对话框");
    messageBox->setText("对话框文本");
    messageBox->setIcon(QMessageBox::Warning);
    //messageBox->setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);

    // 自定义按钮
    QPushButton* button = new QPushButton("自定义", messageBox);
    messageBox->addButton(button, QMessageBox::AcceptRole);
    // 此时槽函数用connect连接, 因为是用户自定义的按钮
    // 如果是用自带的按钮, 那么对于用户点击了哪个按钮
    // 在点击按钮, 对话框关闭后, 通过exec的返回值来知道哪个按钮被点击, 以此来执行对应的逻辑
    
    //messageBox->exec();
	int res = messageBox->exec();
	if (res == QMessageBox::Ok) qDebug() << "OK";
	else qDebug() << "Cancel";

    //delete messageBox;
    // 关闭时释放内存, 删除该对象
    messageBox->setAttribute(Qt::WA_DeleteOnClose);
}

另一种更简单的自定义按钮方式

void MainWindow::on_pushButton_clicked()
{
    int res = QMessageBox::warning(this, "标题", "文本", QMessageBox::Ok | QMessageBox::Cancel);
    if (res == QMessageBox::Ok) qDebug() << "OK";
    else qDebug() << "Cancel";
}

5、QColorDialog

继承自QDialog类,内置了调色板。

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对象

MainWindow项目

#include <QColorDialog>

void MainWindow::on_pushButton_clicked()
{
    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()) + ");";
    
    // C语言风格
    //char style[1024] = {0};
    //sprintf(style, "background-color: rgb(%d, %d, %d);", color.red(), color.green(), color.blue());

    this->setStyleSheet(style);
}

6、QFileDialog

文件对话框

在这里插入图片描述
在这里插入图片描述

MainWindow项目中放两个按钮,一个保存文件,一个打开文件

#include <QFileDialog>

void MainWindow::on_pushButton_open_clicked()
{
    QString filePath = QFileDialog::getOpenFileName(this);
    qDebug() << filePath;
}

void MainWindow::on_pushButton_save_clicked()
{
    QString filePath = QFileDialog::getSaveFileName(this);
    qDebug() << filePath;
}

不过实际的打开和保存的逻辑并没有写,这里只是写了这两个方法的使用。

7、QFontDialog

字体对话框,用于选择字体

MainWindow项目

#include <QFontDialog>

void MainWindow::on_pushButton_clicked()
{
    bool ok = false;
    QFont font = QFontDialog::getFont(&ok);
    qDebug() << "ok = " << ok;
    qDebug() << font.family();
    qDebug() << font.pointSize();
    qDebug() << font.bold();
    qDebug() << font.italic();

    // 选择的字体应用到按钮上
    ui->pushButton->setFont(font);
}

8、QInputDialog

输入对话框

在这里插入图片描述
在这里插入图片描述

MainWindow项目

#include <QDebug>
#include <QInputDialog>

void MainWindow::on_pushButton_clicked()
{
    int res = QInputDialog::getInt(this, "整数输入对话框", "请输入一个整数: ");
    qDebug() << res;
}

void MainWindow::on_pushButton_2_clicked()
{
    double res = QInputDialog::getDouble(this, "浮点数输入对话框", "请输入一个浮点数: ");
    qDebug() << res;
}

void MainWindow::on_pushButton_3_clicked()
{
    QStringList items;
    items.push_back("111");
    items.push_back("222");
    items.push_back("333");
    QString item = QInputDialog::getItem(this, "条目输入对话框", "请输入条目: ", items);
    qDebug() << item;
}

结束。

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

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

相关文章

web3py+flask+ganache的智能合约教育平台

最近在学习web3的接口文档&#xff0c;使用web3pyflaskganache写了一个简易的智能合约教育平台&#xff0c;语言用的是python&#xff0c;ganche直接使用的本地区块链网络&#xff0c;用web3py进行交互。 代码逻辑不难&#xff0c;可以私信或者到我的闲鱼号夏沫mds获取我的代码…

java中的String类、StringBuffer类、StringBuilder类的详细讲解(包含相互之间的比较)

文章目录 一、String 类1 String 类的介绍2 String 对象创建的两种方式3 测试题加深理解&#xff08;1&#xff09; 例题一&#xff08;2&#xff09;例题二&#xff08;3&#xff09; 例题三 4 String 类的常用方法&#xff08;1&#xff09;equals()&#xff08;2&#xff09…

外设链接与中断

外设链接与中断 PC键盘处理过程 定制键盘的输入过程

考研408笔记之数据结构(五)——图

数据结构&#xff08;五&#xff09;——图 1. 图的基本概念 1.1 图的定义 1.2 有向图和无向图 在有向图中&#xff0c;使用圆括号表示一条边&#xff0c;圆括号里元素位置互换没有影响。 在无向图中&#xff0c;使用尖括号表示一条边&#xff0c;尖括号里元素位置互换则表示…

71,【3】buuctf web [HITCON 2017]SSRFme

进入靶场 左上角是IP地址&#xff0c;下面有一堆代码 <?php // 检查是否存在 HTTP_X_FORWARDED_FOR 头部信息 if (isset($_SERVER[HTTP_X_FORWARDED_FOR])) {// 如果存在&#xff0c;将其按逗号分隔&#xff0c;并将第一个元素作为新的 REMOTE_ADDR$http_x_headers explo…

【TypeScript】模块化和命名空间、类型查找、类型缩小

模块化和命名空间 ts 在模块化中遵循 esm 规范&#xff0c;而且推荐导入类型时前面加上 type 字段&#xff0c;这些可以让一个非TypeScript编译器比如Babel、swc或者esbuild知道什么样的导入可以被安全移除。 TypeScript有它自己的模块格式&#xff0c;名为namespaces&#x…

城市生命线安全保障:技术应用与策略创新

城市生命线工程是维系城市正常运行、满足群众生产生活需要的重要基础设施。随着城市化进程的加快&#xff0c;城市基础设施生命线安全运行的复杂性日益加剧&#xff0c;保障城市居民日常生活正常运行的水、电、气、热等各类地下管线以及桥梁、市政设施、轨道交通等城市基础设施…

MVCC在MySQL中实现无锁的原理

一&#xff1a;基础知识 我们知道MySQL是多线程并发处理任务的。MySQL使用了MVCC来实现事务并发的无锁机制。 而且我们还需要知道MySQL的四种隔离级别&#xff1a;读未提交&#xff0c;读已提交&#xff08;RC&#xff09;&#xff0c;可重复读&#xff08;RR&#xff09;&am…

WPF实战案例 | C# WPF实现大学选课系统

WPF实战案例 | C# WPF实现大学选课系统 一、设计来源1.1 主界面1.2 登录界面1.3 新增课程界面1.4 修改密码界面 二、效果和源码2.1 界面设计&#xff08;XAML&#xff09;2.2 代码逻辑&#xff08;C#&#xff09; 源码下载更多优质源码分享 作者&#xff1a;xcLeigh 文章地址&a…

HTML5 Canvas和JavaScript的3D粒子星系效果

HTML部分 基本结构包括<html>, <head>, 和 <body>标签。<title>标签设置了页面标题为“优化版3D粒子星系”。<style>块定义了一些基本样式&#xff1a; body&#xff1a;无边距&#xff0c;隐藏滚动条&#xff0c;黑色背景&#xff0c;禁用触摸…

再见 Crontab!Linux 定时任务的新选择!

引言 说到 Linux 下定时执行任务&#xff0c;大多数人可能会想到 crontab&#xff1f;没错&#xff0c;它的确是 Linux 下比较通用和方便的方式&#xff0c;但是今天我来介绍一种新的方法来创建定时任务并且支持更多更强大的功能。 Systemd 很多小伙伴应该听说过 Systemd&…

Unity入门1

安装之后无法获得许可证&#xff0c;可以考虑重装 新建项目 单击空白处生成脚本 双击c#文件 会自动打开vstudio 检查引用 如果没有引用&#xff0c;重开vstu&#xff0c;或者重新加载项目 hierarchy层级 scenes场景 assets资产 inspector督察 icon图标 资源链接&…

【二叉树】遍历总结!

在很多问题中&#xff0c;熟练掌握二叉树的遍历方法&#xff0c;能够轻松解决很多问题。 新建一棵二叉树root[1,null,2,3] 1、前序遍历 前序遍历的顺序为根节点->左子树->右子树&#xff0c;按照以上二叉树&#xff0c;遍历顺序为[1&#xff0c;2&#xff0c;3]。代码为…

(2)STM32 USB设备开发-USB虚拟串口

例程&#xff1a;STM32USBdevice: 基于STM32的USB设备例子程序 - Gitee.com 本篇为USB虚拟串口教程&#xff0c;没有知识&#xff0c;全是实操&#xff0c;按照步骤就能获得一个STM32的USB虚拟串口。本例子是在野火F103MINI开发板上验证的&#xff0c;如果代码中出现一些外设的…

ASP .NET Core 学习(.NET9)部署(一)windows

在windows部署 ASP .NET Core 的时候IIS是不二选择 一、IIS安装 不论是在window7 、w10还是Windows Server&#xff0c;都是十分简单的&#xff0c;下面以Windows10为例 打开控制面版—程序—启用或关闭Windows功能 勾选图中的两项&#xff0c;其中的子项看需求自行勾选&am…

Java并发编程面试题:线程池Fork/Join(19题)

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

fyne 选项卡设计

用户界面的设计至关重要&#xff0c;它直接影响着用户体验。选卡设计作为一种常见的界面布局方式&#xff0c;能够有效地组织和展示信息&#xff0c;使用户能够方便快捷地浏览和操作。 Fyne 是一个用 Go 语言编写的跨平台 GUI 框架&#xff0c;它提供了丰富的组件和功能&#…

MySQL——主从同步

提醒&#xff1a;进行配置时&#xff0c;需要确保一主两从的操作系统、MySQL版本一致&#xff0c;否则将出现问题 环境介绍 服务器IP主服务器172.25.254.10从服务器-1172.25.254.11从服务器-2172.25.254.12 配置 # 快速配置&#xff0c;选择多重执行&#xff0c;确保版本一…

IDEA中Maven使用的踩坑与最佳实践

文章目录 IDEA中Maven使用的踩坑与最佳实践一、环境配置类问题1. Maven环境配置2. IDEA中Maven配置建议 二、常见问题与解决方案1. 依赖下载失败2. 依赖冲突解决3. 编译问题修复 三、效率提升技巧1. IDEA Maven Helper插件使用2. 常用Maven命令配置3. 多模块项目配置4. 资源文件…

VIVADO-block desgn 中时钟连线报错

问题描述 1.自定义的IP核由于封装不规范&#xff0c;输出的时钟引脚缺少该时钟的相关信息 正常时钟引脚属性 异常的时钟引脚属性 2.run connection automation 中无法找到这种缺少信息的时钟源 3.axi_clk与axi interconnect时钟频率不匹配 解决方案&#xff1a; 1.用BUFG将缺少…