【Qt教程05】Qt中的基础窗口类2——QDialog、 子类QMessageBox、QFileDialog、QFontDialog、QColorDialog、QInputDialog、QProgre

原创作者:郑同学的笔记
原创地址:https://zhengjunxue.blog.csdn.net/article/details/137013846
qq技术交流群:921273910

一、QDialog

对话框类是QWidget类的子类, 处理继承自父类的属性之外, 还有一些自己所特有的属性, 常用的一些API函数如下:

1、常用api

// 构造函数
QDialog::QDialog(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags());

// 模态显示窗口
[virtual slot] int QDialog::exec();
// 隐藏模态窗口, 并且解除模态窗口的阻塞, 将 exec() 的返回值设置为 QDialog::Accepted
[virtual slot] void QDialog::accept();
// 隐藏模态窗口, 并且解除模态窗口的阻塞, 将 exec() 的返回值设置为 QDialog::Rejected
[virtual slot] void QDialog::reject();
// 关闭对话框并将其结果代码设置为r。finished()信号将发出r;
// 如果r是QDialog::Accepted 或 QDialog::Rejected,则还将分别发出accept()或Rejected()信号。
[virtual slot] void QDialog::done(int r);

[signal] void QDialog::accepted();
[signal] void QDialog::rejected();
[signal] void QDialog::finished(int result);

2、demo

场景介绍:
1. 有两个窗口, 主窗口、子窗口
2. 还有一个对话框,
3. 主窗口先显示,
4. 根据用户对话框的操作,选择是否显示子窗口

#include <QApplication>
#include <QWidget>
#include <QDialog>
#include <QPushButton>
#include <QVBoxLayout>

#include <QDebug>

class DialogWindow : public QDialog
{
    Q_OBJECT

public:
    DialogWindow(QWidget *parent = nullptr) : QDialog(parent)
    {
        setWindowTitle("Dialog Window");
        resize(150,100);

        auto showMainButton = new QPushButton("确定跳转子页面", this);
        auto hideMainButton = new QPushButton("取消跳转,返回主页面", this);

        QHBoxLayout *layout = new QHBoxLayout(this);
        layout->addWidget(showMainButton);
        layout->addWidget(hideMainButton);

        connect(showMainButton, &QPushButton::clicked, this, &DialogWindow::showMainWindow);
        connect(hideMainButton, &QPushButton::clicked, this, &DialogWindow::hideMainWindow);
    }
    ~DialogWindow()
    {
        qDebug() << "~DialogWindow";
    }

public slots:
    void showMainWindow()
    {
        this->accept();
    }

    void hideMainWindow()
    {
        this->reject();
    }
};

class ChildWindow : public QWidget
{
        Q_OBJECT
public:
    ChildWindow(QWidget *parent = nullptr) : QWidget(parent)
    {
        setWindowTitle("子页面");
        resize(500, 300);

        auto showMainButton = new QPushButton("退出子页面", this);
        connect(showMainButton, &QPushButton::clicked, this, &ChildWindow::close);

    }
};

class MainWindow : public QWidget
{
        Q_OBJECT
public:
    MainWindow(QWidget *parent = nullptr) : QWidget(parent)
    {
        setWindowTitle("主页面");
        resize(1000, 700);

        auto showMainButton = new QPushButton("跳转子页面", this);
        connect(showMainButton, &QPushButton::clicked, this, &MainWindow::showDialog);

    }
private slots:
    void showDialog()
    {

    //    dialog.show();

        int ret = dialog.exec();
        if(ret == QDialog::Accepted)
        {
            qDebug() << "accept button clicked...";

            // 显示主窗口
            if(nullptr ==w )
            {
               w = new ChildWindow;
               w->show();
            }
            else
            {
                w->show();
                w->activateWindow();
            }

        }
        else if(ret == QDialog::Rejected)
        {
            qDebug() << "reject button clicked...";
            // 不显示主窗口
            if(nullptr !=w)
            {
               delete w;
                w=nullptr;//是否考虑过,没有置为nullptr会有什么问题
            }

        }
        else
        {
            // ret == 666
            qDebug() << "done button clicked...";
            // 根据需求进行逻辑处理

        }

    }
private:
    ChildWindow* w =nullptr;
    DialogWindow dialog;
};



int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    MainWindow mainUI;
    mainUI.show();

    return app.exec();
}

#include "main.moc"

显示结果
在这里插入图片描述

二、QDialog子类

1、QMessageBox

QMessageBox 对话框类是 QDialog 类的子类, 通过这个类可以显示一些简单的提示框, 用于展示警告、错误、问题等信息。关于这个类我们只需要掌握一些静态方法的使用就可以了。

1.1、常用api——静态函数

// 显示一个模态对话框, 将参数 text 的信息展示到窗口中
[static] void QMessageBox::about(QWidget *parent, const QString &title, const QString &text);

/*
参数:
- parent: 对话框窗口的父窗口
- title: 对话框窗口的标题
- text: 对话框窗口中显示的提示信息
- buttons: 对话框窗口中显示的按钮(一个或多个)
- defaultButton
    1. defaultButton指定按下Enter键时使用的按钮。
    2. defaultButton必须引用在参数 buttons 中给定的按钮。
    3. 如果defaultButton是QMessageBox::NoButton, QMessageBox会自动选择一个合适的默认值。
*/
// 显示一个信息模态对话框
[static] QMessageBox::StandardButton QMessageBox::information(
           QWidget *parent, const QString &title, 
           const QString &text, 
           QMessageBox::StandardButtons buttons = Ok,
           QMessageBox::StandardButton defaultButton = NoButton);

// 显示一个错误模态对话框
[static] QMessageBox::StandardButton QMessageBox::critical(
           QWidget *parent, const QString &title, 
           const QString &text, 
           QMessageBox::StandardButtons buttons = Ok,
           QMessageBox::StandardButton defaultButton = NoButton);

// 显示一个问题模态对话框
[static] QMessageBox::StandardButton QMessageBox::question(
           QWidget *parent, const QString &title, 
           const QString &text, 
           QMessageBox::StandardButtons buttons = StandardButtons(Yes | No), 
           QMessageBox::StandardButton defaultButton = NoButton);

// 显示一个警告模态对话框
[static] QMessageBox::StandardButton QMessageBox::warning(
           QWidget *parent, const QString &title, 
           const QString &text, 
           QMessageBox::StandardButtons buttons = Ok,
           QMessageBox::StandardButton defaultButton = NoButton);

1.2、demo

#include <QApplication>
#include <QWidget>
#include <QDialog>
#include <QPushButton>
#include <QMessageBox>

#include <QDebug>


class MainWindow : public QWidget
{
        Q_OBJECT
public:
    MainWindow(QWidget *parent = nullptr) : QWidget(parent)
    {
        setWindowTitle("主页面");
        resize(1000, 700);

        QMessageBox::about(this, "about",  "这是一个简单的消息提示框!!!");
            QMessageBox::critical(this, "critical", "这是一个错误对话框-critical...");
            int ret = QMessageBox::question(this, "question",
                     "你要保存修改的文件内容吗???",
                      QMessageBox::Save|QMessageBox::Cancel,
                      QMessageBox::Cancel);
            if(ret == QMessageBox::Save)
            {
                QMessageBox::information(this, "information", "恭喜你保存成功了, o(* ̄︶ ̄*)o!!!");
            }
            else if(ret == QMessageBox::Cancel)
            {
                QMessageBox::warning(this, "warning", "你放弃了保存, ┭┮﹏┭┮ !!!");
            }



    }
};


int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    MainWindow mainUI;
    mainUI.show();

    return app.exec();
}

#include "main.moc"

运行显示如下
在这里插入图片描述

2、QFileDialog

QFileDialog 对话框类是 QDialog 类的子类, 通过这个类可以选择要打开/保存的文件或者目录。关于这个类我们只需要掌握一些静态方法的使用就可以了。

2.1、API - 静态函数

/*
通用参数:
  - parent: 当前对话框窗口的父对象也就是父窗口
  - caption: 当前对话框窗口的标题
  - dir: 当前对话框窗口打开的默认目录
  - options: 当前对话框窗口的一些可选项,枚举类型, 一般不需要进行设置, 使用默认值即可
  - filter: 过滤器, 在对话框中只显示满足条件的文件, 可以指定多个过滤器, 使用 ;; 分隔
    - 样式举例: 
	- Images (*.png *.jpg)
	- Images (*.png *.jpg);;Text files (*.txt)
  - selectedFilter: 如果指定了多个过滤器, 通过该参数指定默认使用哪一个, 不指定默认使用第一个过滤器
*/
// 打开一个目录, 得到这个目录的绝对路径
[static] QString QFileDialog::getExistingDirectory(
                  QWidget *parent = nullptr, 
                  const QString &caption = QString(), 
                  const QString &dir = QString(), 
                  QFileDialog::Options options = ShowDirsOnly);

// 打开一个文件, 得到这个文件的绝对路径
[static] QString QFileDialog::getOpenFileName(
    	          QWidget *parent = nullptr, 
    		  const QString &caption = QString(), 
                  const QString &dir = QString(), 
                  const QString &filter = QString(), 
                  QString *selectedFilter = nullptr, 
                  QFileDialog::Options options = Options());

// 打开多个文件, 得到这多个文件的绝对路径
[static] QStringList QFileDialog::getOpenFileNames(
    	          QWidget *parent = nullptr, 
                  const QString &caption = QString(), 
                  const QString &dir = QString(), 
                  const QString &filter = QString(), 
                  QString *selectedFilter = nullptr, 
                  QFileDialog::Options options = Options());

// 打开一个目录, 使用这个目录来保存指定的文件
[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());

2.2、demo

#include <QApplication>
#include <QWidget>
#include <QDialog>
#include <QMessageBox>
#include <QFileDialog>
#include <QPushButton>
#include <QDebug>

class MainWindow : public QWidget {
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr) : QWidget(parent) {
        resize(500, 300);

        QPushButton *btn = new QPushButton("打开目录", this);
        connect(btn, &QPushButton::clicked, this, &MainWindow::openMuLu);

        QPushButton *btn2 = new QPushButton("打开文件", this);
        connect(btn2, &QPushButton::clicked, this, &MainWindow::openWenJian);

        btn2->setGeometry(10,50,100,40);
    }

public slots:
    void openMuLu()
    {
        QString dirName = QFileDialog::getExistingDirectory(this, "打开目录", "d:\\log");
        QMessageBox::information(this, "打开目录", "您选择的目录是: " + dirName);
    }

    void openWenJian()
    {
       QString arg("Text files (*.txt)");
       QString fileName = QFileDialog::getOpenFileName(
                 this, "Open File", "d:\\log",
                 "Images (*.png *.jpg);;Text files (*.txt)", &arg);
       QMessageBox::information(this, "打开文件", "您选择的文件是: " + fileName);

    }
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    MainWindow mainWindow;
    mainWindow.resize(400, 300);
    mainWindow.show();

    return app.exec();
}

#include "main.moc"

运行显示结果如下
在这里插入图片描述

3、QFontDialog

关于字体的属性信息, 在QT框架中被封装到了一个叫QFont的类中, 下边为大家介绍一下这个类的API, 了解一下关于这个类的使用。

// 构造函数
  QFont::QFont();
  /*
  参数:
    - family: 本地字库中的字体名, 通过 office 等文件软件可以查看
    - pointSize: 字体的字号
    - weight: 字体的粗细, 有效范围为 0 ~ 99
    - italic: 字体是否倾斜显示, 默认不倾斜
  */
  QFont::QFont(const QString &family, int pointSize = -1, int weight = -1, bool italic = false);
  
  // 设置字体
  void QFont::setFamily(const QString &family);
  // 根据字号设置字体大小
  void QFont::setPointSize(int pointSize);
  // 根据像素设置字体大小
  void QFont::setPixelSize(int pixelSize);
  // 设置字体的粗细程度, 有效范围: 0 ~ 99
  void QFont::setWeight(int weight);
  // 设置字体是否加粗显示
  void QFont::setBold(bool enable);
  // 设置字体是否要倾斜显示
  void QFont::setItalic(bool enable);
  
  // 获取字体相关属性(一般规律: 去掉设置函数的 set 就是获取相关属性对应的函数名)
  QString QFont::family() const;
  bool QFont::italic() const;
  int QFont::pixelSize() const;
  int QFont::pointSize() const;
  bool QFont::bold() const;
  int QFont::weight() const;

3.1、QFontDialog类的静态API

/*
参数:
  - ok: 传出参数, 用于判断是否获得了有效字体信息, 指定一个布尔类型变量地址
  - initial: 字体对话框中默认选中并显示该字体信息, 用于对话框的初始化
  - parent: 字体对话框窗口的父对象
  - title: 字体对话框的窗口标题
  - options: 字体对话框选项, 使用默认属性即可, 一般不设置
*/
  [static] QFont QFontDialog::getFont(
		bool *ok, const QFont &initial, 
		QWidget *parent = nullptr, const QString &title = QString(), 
		QFontDialog::FontDialogOptions options = FontDialogOptions());
  
  [static] QFont QFontDialog::getFont(bool *ok, QWidget *parent = nullptr);

3.2、demo

#include <QApplication>
#include <QWidget>
#include <QDialog>
#include <QPushButton>
#include <QDebug>
#include <QFontDialog>

class MainWindow : public QWidget {
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr) : QWidget(parent) {
        resize(500, 300);

        QPushButton *btn = new QPushButton("设置当前窗口的字体", this);
        connect(btn, &QPushButton::clicked, this, &MainWindow::on_filedlg_clicked);
    }

public slots:
    void on_filedlg_clicked()
    {
        #if 1
            // 方式1
            bool ok;
            QFont ft = QFontDialog::getFont(
                        &ok, QFont("微软雅黑", 12, QFont::Bold), this, "选择字体");
            qDebug() << "ok value is: " << ok;
        #else
            // 方式2
            QFont ft = QFontDialog::getFont(NULL);
        #endif

            // 将选择的字体设置给当前窗口对象
            this->setFont(ft);

    }
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    MainWindow mainWindow;
    mainWindow.resize(400, 300);
    mainWindow.show();

    return app.exec();
}

#include "main.moc"

运行显示结果如下
在这里插入图片描述

4、QColorDialog

关于颜色的属性信息, 在QT框架中被封装到了一个叫QColor的类中, 下边为大家介绍一下这个类的API, 了解一下关于这个类的使用。
各种颜色都是基于红, 绿, 蓝这三种颜色调配而成的, 并且颜色还可以进行透明度设置, 默认是不透明的。

// 构造函数
QColor::QColor(Qt::GlobalColor color);
QColor::QColor(int r, int g, int b, int a = ...);
QColor::QColor();

// 参数设置 red, green, blue, alpha, 取值范围都是 0-255
void QColor::setRed(int red);		// 红色
void QColor::setGreen(int green);	// 绿色
void QColor::setBlue(int blue);	// 蓝色
void QColor::setAlpha(int alpha);	// 透明度, 默认不透明(255)
void QColor::setRgb(int r, int g, int b, int a = 255);

int QColor::red() const;
int QColor::green() const;
int QColor::blue() const;
int QColor::alpha() const;
void QColor::getRgb(int *r, int *g, int *b, int *a = nullptr) const;

4.1、静态API函数

  // 弹出颜色选择对话框, 并返回选中的颜色信息
/*
参数:
    - initial: 对话框中默认选中的颜色, 用于窗口初始化
    - parent: 给对话框窗口指定父对象
    - title: 对话框窗口的标题
    - options: 颜色对话框窗口选项, 使用默认属性即可, 一般不需要设置
*/
  [static] QColor QColorDialog::getColor(
		const QColor &initial = Qt::white, 
		QWidget *parent = nullptr, const QString &title = QString(), 
		QColorDialog::ColorDialogOptions options = ColorDialogOptions());

4.2、demo

#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QColorDialog>
#include <QPainter>
#include <QBrush>
#include <QRect>
#include <QPixmap>
#include <QString>
#include <QLabel>

class MainWindow : public QWidget {
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr) : QWidget(parent) {
        setMinimumSize(600, 400);
        resize(1000, 800);


        QPushButton *btn = new QPushButton("设置颜色", this);
        connect(btn, &QPushButton::clicked, this, &MainWindow::on_filedlg_clicked);

        colorLabel = new QLabel("颜色框!", this);
        colorLabel->setGeometry(120,100,300,100);

        textLabel = new QLabel("字体框!", this);
        textLabel->setGeometry(20,200,400,100);

    }

public slots:
    void on_filedlg_clicked()
    {
        QColor color = QColorDialog::getColor();
        QBrush brush(color);
        QRect rect(0, 0, 100, 100);
        QPixmap pix(rect.size());
        QPainter p(&pix);
        p.fillRect(rect, brush);
        colorLabel->setPixmap(pix);
        QString text = QString("red: %1, green: %2, blue: %3, 透明度: %4")
                .arg(color.red()).arg(color.green()).arg(color.blue()).arg(color.alpha());
        textLabel->setText(text);

        activateWindow();
    }

private:
    QLabel *colorLabel;
    QLabel *textLabel;
};

#include "main.moc"

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    MainWindow mainWindow;
    mainWindow.resize(400, 300);
    mainWindow.show();

    //mainWindow.showMaximized();

    return app.exec();
}

运行显示结果如下
在这里插入图片描述

5、QInputDialog

QInputDialog类是QDialog的子类, 通过这个类我们可以得到一个输入对话框窗口, 根据实际需求我们可以在这个输入窗口中输入整形, 浮点型, 字符串类型的数据, 并且还可以显示下拉菜单供使用者选择。
和前边介绍的对话框类一样, 我们只需要调用这个类的静态成员函数就可以得到想要的窗口了。

5.1、API - 静态函数

// 得到一个可以输入浮点数的对话框窗口, 返回对话框窗口中输入的浮点数
/*
参数:
  - parent: 对话框窗口的父窗口
  - title: 对话框窗口显示的标题信息
  - label: 对话框窗口中显示的文本信息(用于描述对话框的功能)
  - value: 对话框窗口中显示的浮点值, 默认为 0
  - min: 对话框窗口支持显示的最小数值
  - max: 对话框窗口支持显示的最大数值
  - decimals: 浮点数的精度, 默认保留小数点以后1位
  - ok: 传出参数, 用于判断是否得到了有效数据, 一般不会使用该参数
  - flags: 对话框窗口的窗口属性, 使用默认值即可
*/
[static] double QInputDialog::getDouble(
    		QWidget *parent, const QString &title, 
    		const QString &label, double value = 0, 
    		double min = -2147483647, double max = 2147483647, 
    		int decimals = 1, bool *ok = nullptr, 
    		Qt::WindowFlags flags = Qt::WindowFlags());

// 得到一个可以输入整形数的对话框窗口, 返回对话框窗口中输入的整形数
/*
参数:
  - parent: 对话框窗口的父窗口
  - title: 对话框窗口显示的标题信息
  - label: 对话框窗口中显示的文本信息(用于描述对话框的功能)
  - value: 对话框窗口中显示的整形值, 默认为 0
  - min: 对话框窗口支持显示的最小数值
  - max: 对话框窗口支持显示的最大数值
  - step: 步长, 通过对话框提供的按钮调节数值每次增长/递减的量
  - ok: 传出参数, 用于判断是否得到了有效数据, 一般不会使用该参数
  - flags: 对话框窗口的窗口属性, 使用默认值即可
*/
[static] int QInputDialog::getInt(
    		QWidget *parent, const QString &title, 
    		const QString &label, int value = 0, 
    		int min = -2147483647, int max = 2147483647, 
    		int step = 1, bool *ok = nullptr, 
    		Qt::WindowFlags flags = Qt::WindowFlags());

// 得到一个带下来菜单的对话框窗口, 返回选择的菜单项上边的文本信息
/*
参数:
  - parent: 对话框窗口的父窗口
  - title: 对话框窗口显示的标题信息
  - label: 对话框窗口中显示的文本信息(用于描述对话框的功能)
  - items: 字符串列表, 用于初始化窗口中的下拉菜单, 每个字符串对应一个菜单项
  - current: 通过菜单项的索引指定显示下拉菜单中的哪个菜单项, 默认显示第一个(编号为0)
  - editable: 设置菜单项上的文本信息是否可以进行编辑, 默认为true, 即可以编辑
  - ok: 传出参数, 用于判断是否得到了有效数据, 一般不会使用该参数
  - flags: 对话框窗口的窗口属性, 使用默认值即可
  - inputMethodHints: 设置显示模式, 默认没有指定任何特殊显示格式, 显示普通文本字符串
    - 如果有特殊需求, 可以参数帮助文档进行相关设置
*/
[static] QString QInputDialog::getItem(
    		QWidget *parent, const QString &title, 
    		const QString &label, const QStringList &items, 
    		int current = 0, bool editable = true, bool *ok = nullptr, 
    		Qt::WindowFlags flags = Qt::WindowFlags(), 
    		Qt::InputMethodHints inputMethodHints = Qt::ImhNone);

// 得到一个可以输入多行数据的对话框窗口, 返回用户在窗口中输入的文本信息
/*
参数:
  - parent: 对话框窗口的父窗口
  - title: 对话框窗口显示的标题信息
  - label: 对话框窗口中显示的文本信息(用于描述对话框的功能)
  - text: 指定显示到多行输入框中的文本信息, 默认是空字符串
  - ok: 传出参数, 用于判断是否得到了有效数据, 一般不会使用该参数
  - flags: 对话框窗口的窗口属性, 使用默认值即可
  - inputMethodHints: 设置显示模式, 默认没有指定任何特殊显示格式, 显示普通文本字符串
    - 如果有特殊需求, 可以参数帮助文档进行相关设置
*/
[static] QString QInputDialog::getMultiLineText(
    		QWidget *parent, const QString &title, const QString &label, 
    		const QString &text = QString(), bool *ok = nullptr, 
    		Qt::WindowFlags flags = Qt::WindowFlags(), 
    		Qt::InputMethodHints inputMethodHints = Qt::ImhNone);

// 得到一个可以输入单行信息的对话框窗口, 返回用户在窗口中输入的文本信息
/*
参数:
  - parent: 对话框窗口的父窗口 
  - title: 对话框窗口显示的标题信息
  - label: 对话框窗口中显示的文本信息(用于描述对话框的功能)
  - mode: 指定单行编辑框中数据的反馈模式, 是一个 QLineEdit::EchoMode 类型的枚举值
    - QLineEdit::Normal: 显示输入的字符。这是默认值
    - QLineEdit::NoEcho: 不要展示任何东西。这可能适用于连密码长度都应该保密的密码。
    - QLineEdit::Password: 显示与平台相关的密码掩码字符,而不是实际输入的字符。
    - QLineEdit::PasswordEchoOnEdit: 在编辑时按输入显示字符,否则按密码显示字符。
  - text: 指定显示到单行输入框中的文本信息, 默认是空字符串
  - ok: 传出参数, 用于判断是否得到了有效数据, 一般不会使用该参数
  - flags: 对话框窗口的窗口属性, 使用默认值即可
  - inputMethodHints: 设置显示模式, 默认没有指定任何特殊显示格式, 显示普通文本字符串
     - 如果有特殊需求, 可以参数帮助文档进行相关设置
*/
[static] QString QInputDialog::getText(
    		QWidget *parent, const QString &title, const QString &label,
    		QLineEdit::EchoMode mode = QLineEdit::Normal, 
    		const QString &text = QString(), bool *ok = nullptr, 
    		Qt::WindowFlags flags = Qt::WindowFlags(), 
    		Qt::InputMethodHints inputMethodHints = Qt::ImhNone);

5.2、demo

#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QMessageBox>
#include <QInputDialog>

class MainWindow : public QWidget {
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr) : QWidget(parent) {
        setMinimumSize(600, 400);
        resize(1000, 800);


        QPushButton *btn = new QPushButton("输入对话框", this);
        connect(btn, &QPushButton::clicked, this, &MainWindow::on_filedlg_clicked);

        QPushButton *btn2 = new QPushButton("下拉选择", this);
        connect(btn2, &QPushButton::clicked, this, &MainWindow::xiala);

        btn2->setGeometry(10,50,100,40);

        QPushButton *btn3 = new QPushButton("多行输入", this);
        connect(btn3, &QPushButton::clicked, this, &MainWindow::duohang);

        btn3->setGeometry(10,100,100,40);

    }

public slots:
    void on_filedlg_clicked()
    {
        int ret = QInputDialog::getInt(this, "年龄", "您的当前年龄: ", 10, 1, 100, 2);
        QMessageBox::information(this, "年龄", "您的当前年龄: " + QString::number(ret));

    }

    void xiala()
    {
        QStringList items;
        items << "苹果" << "橙子" << "橘子" << "葡萄" << "香蕉" << "哈密瓜";
        QString item = QInputDialog::getItem(this, "请选择你喜欢的水果", "你最喜欢的水果:", items, 1, false);
        QMessageBox::information(this, "水果", "您最喜欢的水果是: " + item);
    }

    void duohang()
    {
        QString info = QInputDialog::getMultiLineText(this, "表白", "您最想对漂亮小姐姐说什么呢?", "呦吼吼...");
        QMessageBox::information(this, "知心姐姐", "您最想对小姐姐说: " + info);

    }

};

#include "main.moc"

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    MainWindow mainWindow;
    mainWindow.resize(400, 300);
    mainWindow.show();

    //mainWindow.showMaximized();

    return app.exec();
}

运行显示结果如下

在这里插入图片描述

6、QProgressDialog

QProgressDialog类是QDialog的子类, 通过这个类我们可以得到一个带进度条的对话框窗口, 这种类型的对话框窗口一般常用于文件拷贝、数据传输等实时交互的场景中。

6.1常用API

// 构造函数
/*
参数:
  - labelText: 对话框中显示的提示信息
  - cancelButtonText: 取消按钮上显示的文本信息
  - minimum: 进度条最小值
  - maximum: 进度条最大值
  - parent: 当前窗口的父对象
  - f: 当前进度窗口的flag属性, 使用默认属性即可, 无需设置
*/
QProgressDialog::QProgressDialog(
	QWidget *parent = nullptr, 
	Qt::WindowFlags f = Qt::WindowFlags());

QProgressDialog::QProgressDialog(
	const QString &labelText, const QString &cancelButtonText, 
	int minimum, int maximum, QWidget *parent = nullptr,
	Qt::WindowFlags f = Qt::WindowFlags());


// 设置取消按钮显示的文本信息
[slot] void QProgressDialog::setCancelButtonText(const QString &cancelButtonText);

// 公共成员函数和槽函数
QString QProgressDialog::labelText() const;
void QProgressDialog::setLabelText(const QString &text);

// 得到进度条最小值
int QProgressDialog::minimum() const;
// 设置进度条最小值
void QProgressDialog::setMinimum(int minimum);

// 得到进度条最大值
int QProgressDialog::maximum() const;
// 设置进度条最大值
void QProgressDialog::setMaximum(int maximum);

// 设置进度条范围(最大和最小值)
[slot] void QProgressDialog::setRange(int minimum, int maximum);

// 得到进度条当前的值
int QProgressDialog::value() const;
// 设置进度条当前的值
void QProgressDialog::setValue(int progress);


bool QProgressDialog::autoReset() const;
// 当value() = maximum()时,进程对话框是否调用reset(),此属性默认为true。
void QProgressDialog::setAutoReset(bool reset);


bool QProgressDialog::autoClose() const;
// 当value() = maximum()时,进程对话框是否调用reset()并且隐藏,此属性默认为true。
void QProgressDialog::setAutoClose(bool close);

// 判断用户是否按下了取消键, 按下了返回true, 否则返回false
bool wasCanceled() const;


// 重置进度条
// 重置进度对话框。wascancelled()变为true,直到进程对话框被重置。进度对话框被隐藏。
[slot] void QProgressDialog::cancel();
// 重置进度对话框。如果autoClose()为真,进程对话框将隐藏。
[slot] void QProgressDialog::reset();   

// 信号
// 当单击cancel按钮时,将发出此信号。默认情况下,它连接到cancel()槽。
[signal] void QProgressDialog::canceled();

// 设置窗口的显示状态(模态, 非模态)
/*
参数:
	Qt::NonModal  -> 非模态
	Qt::WindowModal	-> 模态, 阻塞父窗口
	Qt::ApplicationModal -> 模态, 阻塞应用程序中的所有窗口
*/
void QWidget::setWindowModality(Qt::WindowModality windowModality);

6.2、demo

#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QTimer>
#include <QProgressDialog>

class MainWindow : public QWidget {
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr) : QWidget(parent) {
        setMinimumSize(600, 400);
        resize(1000, 800);


        QPushButton *btn = new QPushButton("进度条", this);
        connect(btn, &QPushButton::clicked, this, &MainWindow::on_filedlg_clicked);
    }

public slots:
    void on_filedlg_clicked()
    {
        // 1. 创建进度条对话框窗口对象
            QProgressDialog *progress = new QProgressDialog(
                        "正在拷贝数据...", "取消拷贝", 0, 100, this);
            // 2. 初始化并显示进度条窗口
            progress->setWindowTitle("请稍后");
            progress->setWindowModality(Qt::WindowModal);
            progress->show();

            // 3. 更新进度条
            static int value = 0;
            QTimer *timer = new QTimer;
            connect(timer, &QTimer::timeout, this, [=]()
            {
                 progress->setValue(value);
                 value++;
                 // 当value > 最大值的时候
                 if(value > progress->maximum())
                 {
                     timer->stop();
                     value = 0;
                     delete progress;
                     delete timer;
                 }
            });

            connect(progress, &QProgressDialog::canceled, this, [=]()
            {
                timer->stop();
                value = 0;
                delete progress;
                delete timer;
            });

            timer->start(50);
    }

};

#include "main.moc"

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    MainWindow mainWindow;
    mainWindow.resize(400, 300);
    mainWindow.show();

    //mainWindow.showMaximized();

    return app.exec();
}

运行显示结果如下

在这里插入图片描述
参考
1.爱编程的大丙——Qt 教程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郑同学的笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值