嵌入式养成计划-44----QT--消息对话框(QMessageBox)--字体对话框--颜色对话框--文件对话框

news2024/11/20 7:23:40

一百一十三、消息对话框 (QMessageBox)

  • 消息对话框给用户提供一个交互式的弹窗,
  • 该类提供两种实现版本,
    • 基于属性版本
    • 基于静态成员函数版本

  • 基于属性版本
    • 需要用消息对话框这样的类 实例化对象
      用该对象调用类里的相关成员函数进行相关设置
      需要调用exec()函数执行对话框
      有参构造:
      QMessageBox::QMessageBox(    //有参构造的函数名
          QMessageBox::Icon icon,  //消息对话框里的图标
          const QString &title,     //消息对话框的标题
          const QString &text,      //对话框显示文本
          QMessageBox::StandardButtons buttons = NoButton, //提供消息对话框按钮
          QWidget *parent = nullptr)  //指定父组件
      
      参数1:
      	QMessageBox::NoIcon  //无图标
      	QMessageBox::Question  //问题图标
      	QMessageBox::Information  //信息图标
      	QMessageBox::Warning  //警告图标
      	QMessageBox::Critical  //错误图标
      
      参数4:
      	QMessageBox::Ok  //OK按钮
      	QMessageBox::Open  //打开按钮
      	QMessageBox::Save
      	QMessageBox::Cancel
      	QMessageBox::Close
      	QMessageBox::Discard
      
      举个例子:
        QMessageBox msgBox;
        msgBox.setText("The document has been modified.");
        msgBox.setInformativeText("Do you want to save your changes?");
        msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
        msgBox.setDefaultButton(QMessageBox::Save);
        int ret = msgBox.exec();
      
    • ui界面:
      在这里插入图片描述
    • 示例 :
      //警告按钮对应的槽函数处理
      void Widget::on_pushButton_clicked()
      {
          //用消息对话框这样的类 实例化一个对象
          QMessageBox msg(
                      QMessageBox::Warning, //图标
                      "警告",                  //对话框标题
                      "你给我小心点",     //对话框文本
                      QMessageBox::Yes | QMessageBox::No, //提供按钮
                      this);  //父对象
          //要用exec()函数执行对话框
          int ret = msg.exec();
          //对用户选中的按钮进行判断
          if(ret == QMessageBox::Yes)
          {
              qDebug() <<"好哈哈哈";
          }
          else
          {
              qDebug() <<"别这样。。";
          }
      }
      
  • 基于静态成员函数消息对话框的弹出
    • 不需要实例化对象了,直接调用该类里的静态成员函数,
    • 提供了四个:critical、information、warning、questio
    • 以question为例:
      [static] QMessageBox::StandardButton  //函数返回值类型,用户选中的按钮
      		    QMessageBox::question(     //函数名
      		        QWidget *parent,   //指定父对象
      		        const QString &title, //对话框标题
      		        const QString &text,  //对话框文本
      		        QMessageBox::StandardButtons buttons = StandardButtons(Yes | No)) //默认提供了一对按钮
      
    • 示例 :
      //问题按钮2对应的槽函数处理
      void Widget::on_pushButton_5_clicked()
      {
          //直接调用静态成员函数
          int ret = QMessageBox::question(this,
                                "问题",
                                "天亮了吗",
                                QMessageBox::Yes | QMessageBox::No);
          //判断用户选的按钮
          if(ret==QMessageBox::Yes)
          {
              qDebug() <<"亮了";
          }
          else
          {
              qDebug()<<"还没";
          }
      }
      

一百一十四、字体对话框、颜色对话框、文件对话框

114.1 字体对话框 (QFontDialog)

  • 该类给用户提供了一个字体对话框,可以直接使用该类中静态成员函数 getFont() 弹出字体对话框。
    • getFont() 函数 :如果想使用该函数 需要的头文件: QFontDialog、 QFont
    [static] QFont  //函数返回值类型  返回是用户选中的字体
        QFontDialog::getFont(  //函数名
            bool *ok,     //判断用户是否选中字体
            const QFont &initial,  //初始字体
            QWidget *parent = nullptr,  //父对象
            const QString &title = QString()) //对话框的标题  
    参数2QFont::QFont(const QString &family, 
    		int pointSize = -1, 
    		int weight = -1, 
    		bool italic = false)
    
    • ui界面
      在这里插入图片描述
    • 示例 :
      //字体按钮对应的槽函数
      void Widget::on_fontBtn_clicked()
      {
          bool ok; //判断用户是否选中了字体
          //调用静态成员函数弹出对话框
          QFont f = QFontDialog::getFont(&ok, //判断用户是否选中了字体
                               QFont("隶书",8,10,false),//初始字体
                               this, //父对象
                               "字体");//标题
          //判断ok,如果用户没有选中字体,那么ok是false,否则是true
          if(ok)
          {
              //说明用户选中了字体
              //将用户选中的字体设置文本中
              //ui->textEdit->setFont(f); //让文本全部设置成该字体
              ui->textEdit->setCurrentFont(f);
          }
          else
          {
              //说明用户没有选字体
              QMessageBox::information(this,"提示","没有选字体");
          }
      }
      

114.2 颜色对话框 (QColorDialog)

  • 该类提供一个颜色对话框给用户使用,直接使用类里静态成员函数 getColor() 直接弹出颜色对话框
    • getColor() : 需要两个头文件:QColorDialog 、QColor
      [static] QColor  //函数返回值类型 返回的是用户选中的颜色
          QColorDialog::getColor( //函数名
          const QColor &initial = Qt::white, //初始颜色
          QWidget *parent = nullptr, //父对象
          const QString &title = QString()) //颜色对话框标题
      参数1QColor::QColor(int r, int g, int b, int a = ...)
      
    • 示例 :
      //颜色按钮对应的槽函数处理
      void Widget::on_colorBtn_clicked()
      {
         //直接调用颜色对话框的静态成员函数
          QColor c = QColorDialog::getColor(QColor(0,255,255),
                                 this,
                                 "颜色对话框");
          if(c.isValid()) //判断是否是有效颜色
          {
              //说明用户选中的是有效颜色
              //将选中的颜色设置到文本中
              //ui->textEdit->setTextColor(c); 设置前景色
              ui->textEdit->setTextBackgroundColor(c);//背景色
          }
          else
          {
              //说明用户选中的是无效颜色
              QMessageBox::information(this,"提示信息","选中的是无效颜色");
          }
      }
      

114.3 文件对话框 (QFileDialog)

  • 该类提供了一个文件对话框,用于给用户提供文件路径,

  • 类里有两个静态成员函数 getOpenFileName()getSaveFileName() 弹出文件对话框

    • 都需要包含 QFileDialog、QFile 这俩头文件
    • getOpenFileName()
      [static] QStringList //函数返回值类型  返回的是打开文件的路径
          QFileDialog::getOpenFileNames( //函数名
          QWidget *parent = nullptr,  //父对象
          const QString &caption = QString(), //文件对话框标题 
          const QString &dir = QString(),  //起始位置
          const QString &filter = QString(), //过滤器
          QString *selectedFilter = nullptr) //选中的过滤器
      
    • 举个例子:
      QStringList files = QFileDialog::getOpenFileNames(
                            this,
                            "Select one or more files to open",
                            "/home",
                            "Images (*.png *.xpm *.jpg)");
      
    • getSaveFileName()
      [static] QString 
          QFileDialog::getSaveFileName(
          QWidget *parent = nullptr, 
          const QString &caption = QString(), 
          const QString &dir = QString(), 
          const QString &filter = QString(), 
          QString *selectedFilter = nullptr, 
          QFileDialog::Options options = Options())
      
  • 读文件

    //打开按钮对应的槽函数实现
    void Widget::on_openBtn_clicked()
    {
       QString fileName = QFileDialog::getOpenFileName(this, //父对象
                                    "打开文件", //标题
                                    "./",   //起始位置
                                    "All(*.*);; Img(*.png *.jpg *.gif);; 文本(*.txt)");//过滤器
       qDebug() <<fileName;
       //实例化一个文件的对象
       QFile file(fileName);
       
       if(!file.exists())
       {
           return;
       }
       //打开文件
       if(!file.open(QFile::ReadWrite)) //判断是否能成功打开
       {
           return;
       }
       //读取文件内容
       QByteArray msg = file.readAll();
       //关闭文件
       file.close();
       //将读取的内容放入textEdit上
       //ui->textEdit->setText(QString::fromLocal8Bit(msg));
       ui->textEdit->setText(msg);
    }
    
  • 写文件

    //保存按钮对应的槽函数
    void Widget::on_saveBtn_clicked()
    {
        QString fileName = QFileDialog::getSaveFileName(this);
        //实例化一个文件类对象
        QFile file(fileName);
        //打开文件
        file.open(QFile::WriteOnly);
        //获取textEdit上的内容
        QString msg = ui->textEdit->toPlainText();
        //写入数据
        file.write(msg.toLocal8Bit());
        //关闭文件
        file.close();
    }
    

114.4 qt中文件读写

  • 用到的类是 : QFile
  • 步骤 :
    1. 用QFile实例化一个对象,可以给该对象一个文件路径
    2. 打开文件 需要写上打开方式 读、写
    3. 读取数据 read() readLine() readAll()
    4. 写入数据 write()
    5. 关闭文件 close()

小作业 完善登录框,并跳转到下一界面

1. 点击登录对话框,如果账号和密码匹配,则弹出信息对话框,给出提示”登录成功“,
	提供一个Ok按钮,用户点击Ok后,关闭登录界面,跳转到新的界面中
	
2. 如果账号和密码不匹配,弹出错误对话框,给出信息”账号和密码不匹配,是否重新登录“,
	并提供两个按钮Yes|No,
	用户点击Yes后,清除密码框中的内容,继续让用户进行登录,
	如果用户点击No按钮,则直接关闭登录界面
	
3. 如果用户点击取消按钮,则弹出一个问题对话框,给出信息”您是否确定要退出登录?“,
	并给出两个按钮Yes|No,
	用户点击Yes后,关闭登录界面,
	用户点击No后,关闭对话框,继续执行登录功能
	
要求:对话框:基于属性版和基于静态成员函数版至少各用一个
要求:尽量每行代码都有注释

我写的

login.h

#ifndef LOGIN_H
#define LOGIN_H

#include <QWidget>
#include <QPushButton>
#include <QDebug>
#include <QString>
#include <QMessageBox>

QT_BEGIN_NAMESPACE
namespace Ui { class Login; }
QT_END_NAMESPACE

class Login : public QWidget
{
    Q_OBJECT

public:
    Login(QWidget *parent = nullptr);
    ~Login();

signals:
    //  跳转到下一界面的信号
    void jump();

//public slots:
    //  关闭登录窗口的槽,已注释掉
//    void close_window_slot();

private slots:
    //  点击取消按钮的槽函数
    void on_cencelBtn_clicked();

private:
    Ui::Login *ui;
};
#endif // LOGIN_H

second.h

#ifndef SECOND_H
#define SECOND_H

#include <QWidget>

namespace Ui {
class Second;
}

class Second : public QWidget
{
    Q_OBJECT

public:
    explicit Second(QWidget *parent = nullptr);
    ~Second();

public slots:
    //  打开第二界面的槽函数声明
    void jumpSlot();

private slots:
    //  关闭第二界面的槽函数声明
    void on_closeSecondWindow_clicked();

private:
    Ui::Second *ui;
};

#endif // SECOND_H

login.cpp

#include "login.h"
#include "ui_login.h"

Login::Login(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Login)
{
    ui->setupUi(this);
    //  上半部分的图画
    ui->loginLab->setPixmap(QPixmap(":/pictrue/qq_login.gif"));
    //  设置上半部分图画为自适应大小
    ui->loginLab->setScaledContents(true);

    //  设置窗口左上角的企鹅和QQ
    this->setWindowTitle("QQ");
    this->setWindowIcon(QIcon(":/pictrue/qie.png"));

    //  设置输入框前面的企鹅和密码图片
    ui->unameLab->setPixmap(QPixmap(":/pictrue/qie.png"));
    ui->passwdLab->setPixmap(QPixmap(":/pictrue/passwd.jpg"));
    //  设置密码输入形式
    ui->passwdEdit->setEchoMode(QLineEdit::Password);
    //  设置头像
    ui->touxiang->setPixmap(QPixmap(":/pictrue/touxiang.ico"));
    //  设置右下角的二维码
    ui->ewm->setPixmap(QPixmap(":/pictrue/eweima.png"));

    //  用 QT4 的方式连接自定义的槽函数,用于让 取消按钮 去 关闭窗口
//    connect(ui->cencelBtn, SIGNAL(clicked()), this, SLOT(close_window_slot()));

    //  用 QT5 的方式 让登录按钮 连接自定义的槽函数
    connect(ui->loginBtn,&QPushButton::clicked,[&](){
        //  如果用户名为"admin"且密码为"123456"
        if(ui->unameEdit->text() == "admin" && ui->passwdEdit->text() == "123456"){
            //  用静态成员函数的方式打开(提示信息)消息对话框
            int res = QMessageBox::information(this,                //  父对象
                                               "登录成功",           //  标头
                                               "恭喜你,登录成功",     //  提示信息
                                               QMessageBox::Ok);    //  按钮
            //  如果在消息对话框中点击的是Ok
            if(res==QMessageBox::Ok){
                //  关闭当前窗口(登录窗口)并发射jump信号
                this->close();
                emit jump();
            }
        }
        //  如果用户名和密码不是"admin"和"123456"
        else
        {
            //  用定义对象的方式打开(错误提示)消息对话框
            QMessageBox msg(QMessageBox::Critical,                //  错误提示方式
                            "登录失败",                            //  标头
                            "账号和密码不匹配,是否重新登陆",          //  提示信息
                            QMessageBox::Yes | QMessageBox::No,   //  按钮
                            this);  //  父对象
            //  接收消息对话框的点击结果
            int res = msg.exec();
            //  如果点击的是  Yes,则清空密码输入框
            if(res==QMessageBox::Yes){
                ui->passwdEdit->clear();
            }else if(res==QMessageBox::No){//  如果点击的是  No,则关闭窗口
                this->close();
            }
        }
    });

}

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

//  关闭登录界面的槽函数实现,已注释
//void Login::close_window_slot()
//{
//    this->close();
//}

//  点击取消按钮的槽函数实现
void Login::on_cencelBtn_clicked()
{
    //  弹出(询问)消息对话框
    int res = QMessageBox::question(this,"提示","是否取消登录?");
    //  如果点击的是Yes,则关闭当前界面(登录界面),点击其他则只是关闭这个弹出的(询问)消息对话框
    if(res==QMessageBox::Yes){
        this->close();
    }
}

second.cpp

#include "second.h"
#include "ui_second.h"

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

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

//  关闭第二界面的槽函数实现
void Second::on_closeSecondWindow_clicked()
{
    this->close();
}
//  打开第二界面的槽函数实现
void Second::jumpSlot(){
    this->show();
}

main.cpp

#include "login.h"
#include "second.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Login w;
    w.show();

    //  创建第二界面对象
    Second s;
    //  将登录界面的 jump 信号,与第二界面的 jumpSlot 槽函数绑在一起
    QObject::connect(&w, &Login::jump, &s, &Second::jumpSlot);
    return a.exec();
}

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

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

相关文章

web:[MRCTF2020]Ez_bypass

题目 点进题目 调整一下 进行代码审计&#xff0c;先看第一段 if(isset($_GET[gg])&&isset($_GET[id])) {$id$_GET[id];$gg$_GET[gg];if (md5($id) md5($gg) && $id ! $gg) {echo You got the first step; get参数传参&#xff0c;后判断md5后的值是否相等&…

2023前端面试题总结

给大家推荐一个实用面试题库 1、前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;web前端面试题库 Html5和CSS3 常见的水平垂直居中实现方案 最简单的方案当然是flex布局 .father {display: flex;justify-content…

手部关键点检测4:Android实现手部关键点检测(手部姿势估计)含源码 可实时检测

目录 1. 前言 2.手部关键点检测(手部姿势估计)方法 (1)Top-Down(自上而下)方法 (2)Bottom-Up(自下而上)方法&#xff1a; 3.手部关键点检测模型训练 4.手部关键点检测模型Android部署 &#xff08;1&#xff09; 将Pytorch模型转换ONNX模型 &#xff08;2&#xff09; …

嘉立创使用技巧

立创社区&#xff1a;电子工程师交流社区_电子发烧友论坛_嘉立创&立创商城旗下专业电子论坛【立创社区】 (szlcsc.com) 嘉立创官网使用教程&#xff1a;立创EDA使用教程 (lceda.cn) 嘉立创是国产软件对新手友好&#xff0c;中国人更懂中国人。下面介绍我在使用中用到的技巧…

【unity小技巧】适用于任何 2d 游戏的钥匙门系统和buff系统——UnityEvent的使用

文章目录 每篇一句前言开启配置门的开启动画代码调用&#xff0c;控制开启门动画 新增CollisionDetector 脚本&#xff0c;使用UnityEvent &#xff0c;控制钥匙和门的绑定多把钥匙控制多个门一把钥匙控制多个门 BUFF系统扩展参考源码完结 每篇一句 人总是害怕去追求自己最重要…

堆-----数据结构

引言 什么是堆&#xff1f;堆是一种特殊的数据结构&#xff08;用数组表示的树&#xff09;。 为什么要使用到堆&#xff1f;比如一场比赛&#xff0c;如果使用擂台赛的方式来决出冠军&#xff08;实力第一&#xff09;&#xff0c;就很难知道实力第二的队伍是什么了。 但是…

Simulink 最基础教程(三)常用模块

3.1源模块 1&#xff09;clock 这个模块的输出是 y(t)t。很多信号都是和时间 t 相关的&#xff0c;例如正弦波信号&#xff0c;可以写成 sin(w*t) 的形式。虽然软件也提供了正弦波模块&#xff0c;但如果用 clock 模块三角运算模块&#xff0c;对初学者而言&#xff0c;也是很好…

QT_day3

完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到新的界面中 如果账号和密码不匹配&#…

科技资讯|2023全球智能手表预估出货1.3亿块,智能穿戴提升AI功能

根据集邦咨询公布的最新报告&#xff0c;受全球经济低迷影响&#xff0c;2023 年全球智能手表出货量预估为 1.3 亿块。苹果以超过 30% 的份额领先&#xff0c;其次是三星&#xff08;接近 10%&#xff09;、华为、Garmin、Fitbit 等。 报告认为苹果、三星和华为等主要智能手表…

智能新零售管理系统哪个好?亿发数字化收银系统提供商,可定制

在数字化时代的背景下&#xff0c;传统收银系统已经无法满足商家不断增加的业务需求。因此&#xff0c;出现了智能门店收银系统&#xff0c;该系统旨在为商家提供更加智能、高效的解决方案&#xff0c;满足商家的个性化需求&#xff0c;帮助中小型商家提高数字化运营能力。 1、…

运筹优化 | Python调用Gurobi求解线性规划 | 代码解析

需要求解的线性规划 from gurobipy import *定义了一个线性松弛问题&#xff0c;并用Gurobi求解 initial_LP Model(initial LP) # 定义变量initial_LP&#xff0c;调用Gurobi的Model&#xff0c;选择Initial Programming&#xff08;整数规划&#xff09;模型 x {} # 创建一个…

TCP/IP模型五层协议

TCP/IP模型五层协议 认识协议 约定双方进行的一种约定 协议分层 降低了学习和维护的成本&#xff08;封装&#xff09;灵活的针对这里的某一层协议进行替换 四/五层协议 五层协议的作用 应用层 应用层常见协议 应用层常见协议概览 基于TCP的协议 HTTP&#xff08;超…

【C++】命名空间和using namespace std的注意事项

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

2022年下半年 软件设计师 上午试卷(22题—40题)

对高级语言源程序进行编译或解释的过程中需要进行语法分析&#xff0c;递归子程序分析属于 &#xff08;22&#xff09; 的分析法。 &#xff08;22&#xff09; A. 自上而下 B. 自下而上 C. 从左至右 D. 从右至左 注意字眼”递归“&#xff0c;自上而下的语法分析方法是一种自…

深入理解 Netty FastThreadLocal

作者&#xff1a;vivo 互联网服务器团队- Jiang Zhu 本文以线上诡异问题为切入点&#xff0c;通过对比JDK ThreadLocal和Netty FastThreadLocal实现逻辑以及优缺点&#xff0c;并深入解读源码&#xff0c;由浅入深理解Netty FastThreadLocal。 一、前言 最近在学习Netty相关的…

【C++面向对象】1. 类、对象

文章目录 【 1. 类 & 对象的定义 】1.1 类的定义1.2 对象的定义 【 2. 类的成员 】2.1 数据成员2.2 成员函数类的内部定义成员函数类的外部定义成员函数成员函数的访问实例 【 3. 类的访问修饰符 】3.1 public 公有成员3.2 private 私有成员3.3 protected 保护成员3.4 继承…

【Excel】WPS单元格快速转换表格字母大小写

使用WPS Office打开表格&#xff0c;选择需要处理的单元格或单元格区域。 依次点击「会员专享」选项卡 —>「智能工具箱」。 再点击「格式」—>「大小写」&#xff0c;选择一种大小写转换方式即可。

测试开发之自动化篇 —— 使用Selenium IDE录制脚本!

今天&#xff0c;我们开始介绍基于开源Selenium工具的Web网站自动化测试。 Selenium包含了3大组件&#xff0c;分别为&#xff1a;1. Selenium IDE 基于Chrome和Firefox扩展的集成开发环境&#xff0c;可以录制、回放和导出不同语言的测试脚本。 2. WebDriver 包括一组为不同…

AI智能视频监控系统解锁新场景:大型音乐节活动视频监控方案

随着近日音乐节的大火&#xff0c;越来越多的人喜欢参加音乐节进行放松娱乐。音乐节通常都会聚集大量人群&#xff0c;为了确保参与者的安全&#xff0c;在音乐节期间设置智能视频监控系统可以帮助管理人员及时发现和应对任何潜在危险或紧急情况&#xff0c;可以保障参与者的生…

重磅升级!官网全新改版上线啦~

新布局、新风格 新体验、新服务 棱镜七彩新版官网 正式上线啦&#xff01; 各版块功能全新升级 为广大用户提供更优质的服务体验&#xff01; 重构版块信息&#xff0c;用户需求一键直达 新官网结构大焕新&#xff0c;升级后的官网根据用户需求进行了更合理的设置与规划…