QT开发(二十)——QT对话框

一、对话框简介

对话框是与用户进行简短交互的顶层窗口

QDialog是QT中所有对话框窗口的基类,QDialog继承于QWidget,是一种容器型的组件,是定制了窗口样式的特殊QWidget。

QDialog作为一种专用的交互窗口,不能作为子部件嵌入其他容器中。

二、对话框类型

对话框类型分为模态对话框和非模态对话框。

1、模态对话框

模态对话框显示后无法与父窗口进行交互,是一种阻塞式的对话框,使用QDialog::exec()函数调用。

模态对话框一般在栈上创建。

    QDialog dialog(this);

    dialog.exec();

模态对话框适用于必须依赖用户选择的场合,比如消息显示,文件选择,打印设置等。

2、非模态对话框

非模态对话框显示后独立存在,可以同时与父窗口进行交互,是一种非阻塞式对话框,使用QDialog::show()函数调用。

非模态对话框一般在堆上创建,需要指定Qt:WA_DeleteOnClose属性,避免内存泄漏。

非模态对话框适用于特殊功能设置的场合,比如查找操作,属性设置等。

    QDialog* dialog = new QDialog(this);

    dialog->setAttribute(Qt::WA_DeleteOnClose);

    dialog->show();

3、混合属性对话框

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

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

    QDialog* dialog = new QDialog(this);

    dialog->setAttribute(Qt::WA_DeleteOnClose);

    dialog->setModal(true);

    dialog->show();

三、对话框的返回值

只有模态对话框采用返回值,模态对话框的返回值用于表示交互结果。

QDialog::exec()函数的返回值作为交互结果。

void QDialog::done(int i)函数关闭对话框,并将参数作为交互结果。

QDialog::Accepted表示用户操作成功

QDialog::Rejected表示用户操作失败

 

四、标准对话框

1、标准对话框的类型

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

wKioL1gkmhCzG1NuAADcnPdKIBA116.png

对话框对象的定义

QDialogType dialog(this);

对话框属性设置

dialog.setPropertyxxxx(value);

if(dialog.exec() == QDialogType::vaule)

{

Type v = dialog.getDialogValue();

}

2、消息对话框QMessageBox

消息对话框是应用程序中最常用的界面元素。消息对话框主要用于为用户提示重要信息,强制用户进行选择操作。

消息对话框的使用方式如下:

A、创建消息对话框对象

    QMessageBox msg(this);

B、设置消息对话框属性

    msg.setWindowTitle(Warning Message);

    msg.setText(Error Massage!);

    msg.setIcon(QMessageBox::Information);

    msg.setStandardButtons(QMessageBox::Ok | QMessage::Cancel);

    if(dialog.exec() == QMessageBox::Ok)

    {

        //

    }

C、QMessageBox实用函数

    QMessageBox定义了静态成员函数,可以直接调用创建不同风格的消息对话框。

StandardButton information(QWidget * parent, const QString & title, const QString & text, StandardButtons buttons = Ok, StandardButtondefaultButton = NoButton)

StandardButton question(QWidget * parent, const QString & title, const QString & text, StandardButtons buttons = Ok, StandardButtondefaultButton = NoButton)

StandardButton warning(QWidget * parent, const QString & title, const QString & text, StandardButtons buttons = Ok, StandardButtondefaultButton = NoButton)

StandardButton critical(QWidget * parent, const QString & title, const QString & text, StandardButtons buttons = Ok, StandardButton defaultButton= NoButton)

void about(QWidget * parent, const QString & title, const QString & text)

3、文件对话框QFileDialog

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

文件对话框的使用方式如下

A、创建文件对话框对象

QFileDialog fdialog(this);

B、文件对话框属性设置

打开文件设置如下:

    fdialog.setAcceptMode(QFileDialog::AcceptOpen);

    //选择打开多个文件QFileDialog::ExistingFiles

    fdialog.setFileMode(QFileDialog::ExistingFile);

    if(fdialog.exec() == QFileDialog::Accepted)

    {

        QStringList s = fdialog.selectedFiles();

        for(int i = 0; i < s.count(); i++)

        {

            qDebug() << s[i];

        }

    }

    保存文件设置如下:

    fdialog.setAcceptMode(QFileDialog::AcceptSave);

    if(fdialog.exec() == QFileDialog::Accepted)

    {

        QStringList s = fdialog.selectedFiles();

        for(int i = 0; i < s.count(); i++)

        {

            qDebug() << s[i];

        }

    }

C、文件类型过滤器

在文件对话框中可以通过文件后缀定义文件过滤器。文件过滤器定义规则如下:

显示名(*.后缀名1 *.后缀名2 ...*.后缀名n)

    Image(*.jpg *.png)

    Text(*.txt)

    All(*.*)

  fdialog.setFilter("Image(*.png *.jpg)");

    D、文件对话框实用函数

    QFileDialog定义了多个静态成员函数用于直接使用文件对话框。

QString getOpenFileName(QWidget * parent = 0, const QString & caption = QString(), const QString & dir = QString(), const QString & filter = QString(), QString * selectedFilter = 0, Options options = 0)

QStringList getOpenFileNames(QWidget * parent = 0, const QString & caption = QString(), const QString & dir = QString(), const QString & filter = QString(), QString * selectedFilter = 0, Options options = 0)

QString getSaveFileName(QWidget * parent = 0, const QString & caption = QString(), const QString & dir = QString(), const QString & filter = QString(), QString * selectedFilter = 0, Options options = 0)

 

4、颜色对话框QColorDialog

QT中也提供了预定义的颜色对话框类QColorDialog。颜色对话框使用方式如下:

A、创建颜色对话框QColorDialog对象

    QColorDialog cdialog(this);

B、颜色对话框属性设置

cdialog.setWindowTitle("Color Editer");

    //设置初始颜色

    cdialog.setCurrentColor(Qt::red);

    if(cdialog.exec() == QColorDialog::Accepted)

    {

        qDebug() << cdialog.selectedColor();

    }

    C、QColor

    QT中使用QColor表示颜色,支持多种颜色的表示方法。

    RGB:红、绿、蓝为基准的三色模型

    HSV:色调、饱和度、明度为基准的六角锥体模型

    CMYK:天蓝、品红、黄色、黑为基准的全彩印刷色彩模型

    QColor支持在三种颜色模型间转换。

    QColor color = dlg.selectedColor();

    qDebug() << color;

    qDebug() << color.red();

    qDebug() << color.green();

    qDebug() << color.blue();

    qDebug() << color.hue();

    qDebug() << color.saturation();

    qDebug() << color.value();

    D、QColorDialog实用函数

    QColorDialog定义了直接使用颜色对话框的静态成员函数。

QColor getColor(const QColor & initial, QWidget * parent, const QString & title, ColorDialogOptions options = 0)

QColor getColor(const QColor & initial = Qt::white, QWidget * parent = 0)

5、输入对话框QInputDialog

QT中提供了预定义的输入对话框类QInputDialog,用于需要临时进行数据输入的场合。

wKiom1gkmjuyA5YvAAARQms7EIg931.png

输入对话框的使用方法如下:

A、创建输入对话框对象

 QInputDialog idialog(this);

B、输入对话框属性设置

 idialog.setWindowTitle("Enter Data");

    idialog.setLabelText("Please Enter a int:");

    idialog.setInputMode(QInputDialog::IntInput);

    if(idialog.exec() == QInputDialog::Accepted)

    {

        qDebug() << idialog.intValue();

    }

C、输入对话框的输入模式

QInputDialog::TextInput输入文本字符串

QInputDialog::IntInput输入整型数

QInputDialog::DoubleInput输入浮点数

 

D、QInputDialog的实用函数

QInputDialog定义了多个静态成员函数,直接调用使用输入对话框。

double getDouble(QWidget * parent, const QString & title, const QString & label, double value = 0, double min = -2147483647, double max = 2147483647, int decimals = 1, bool * ok = 0, Qt::WindowFlags flags = 0)

int getInt(QWidget * parent, const QString & title, const QString & label, int value = 0, int min = -2147483647, int max = 2147483647, int step= 1, bool * ok = 0, Qt::WindowFlags flags = 0)

QString getItem(QWidget * parent, const QString & title, const QString & label, const QStringList & items, int current = 0, bool editable = true, bool *ok = 0, Qt::WindowFlags flags = 0)

QString getText(QWidget * parent, const QString & title, const QString & label, QLineEdit::EchoMode mode = QLineEdit::Normal, const QString &text = QString(), bool * ok = 0, Qt::WindowFlags flags = 0)

6、字体对话框QFontDialog

QT中提供了预定义的字体对话框类QFontDialog,用于提供选择字体的对话框部件。

字体对话框的使用方法如下:

A、创建字体对话框对象

QFontDialog fdialog(this);

B、字体对话框属性设置

    fdialog.setWindowTitle("Select Font");

    fdialog.setCurrentFont(QFont("Courier New", 10, QFont::Bold));

    if(fdialog.exec() == QFontDialog::Accepted)

    {

        qDebug() << fdialog.selectedFont();

    }

C、QFontDialog实用函数

QFontDialog定义了静态成员函数,直接调用可以使用字体对话框选择字体。

QFont getFont(bool * ok, const QFont & initial, QWidget * parent, const QString & title, FontDialogOptions options)

QFont getFont(bool * ok, const QFont & initial, QWidget * parent, const char * name)

QFont getFont(bool * ok, QWidget * parent, const char * name)

QFont getFont(bool * ok, const QFont & initial, QWidget * parent, const QString & title)

QFont getFont(bool * ok, const QFont & initial, QWidget * parent = 0)

QFont getFont(bool * ok, QWidget * parent = 0)

7、进度对话框QProgressDialog

QT提供了预定义的进度对话框类QProgressDialog,用于显示进度信息和需要用户等待的场合。

进度对话框的使用方法如下:

A、创建进度对话框对象

    QProgressDialog pdialog(this);

B、进度对话框属性设置

    pdialog.setWindowTitle("Progress.....");

    pdialog.setLabelText("The application having done at ....");

    pdialog.setMaximum(100);

    pdialog.setMinimum(0);

    pdialog.setValue(30);

    pdialog.exec();

wKioL1gkmlzxaAN2AAAQjYTjXw0635.png

8、打印对话框QPrintDialog

QT中提供了预定义的打印对话框类QPrintDialog,用于设置打印相关的参数信息。

打印对话框的使用方法如下:

A、创建打印对话框对象

QPrintDialog prdialog(this);

B、打印对话框属性设置

    prdialog.setWindowTitle("Setting the Printer");

    if(prdialog.exec() == QPrintDialog::Accepted)

    {

        QPrinter *p = prdialog.printer();

        QTextDocument td;

        td.setPlainText("Hello world!");

        p->setOutputFileName("d:\\hello.pdf");

        td.print(p);

    }

C、QPrinter类

    QT中的QPrinter类是打印设备及其参数的封装,封装了系统中打印设备的驱动接口,以相同方式使用系统中的不同打印设备。

wKiom1gkmpezi9m4AABA1xwRsZk031.png

五、窗体之间数据的传递

QT窗体之间数据的传递有三种方式:信号槽机制、公有函数接口、全局变量。

1、QT信号槽传递

在发送数据的窗体类中定义带参数的信号,发送信号;在接收数据的窗体中定义接收数据的槽函数;将发送数据的信号和接收数据的槽函数连接。

声明信号:

signals:  

    void sendData(QString);   

发送信号(带参数内容):

emit sendData(lineEdit->text());

定义槽函数(带参数内容):

private slots:  

   void receiveData(QString data); 

连接信号与槽:

connect(sender,SIGNAL(sendData(QString)),receiver,SLOT(receiveData(QString)));

2、公有函数接口传递

使用公有成员函数接口可以在不同类外调用类的成员函数,返回需要的数据。

3、全局变量传递

全局变量可以在一个文件中定义,其他文件中声明后使用,实现数据的共享传递。

六、登录对话框实例

    登录对话框是应用程序常用的部件。

wKioL1gkmsWC4Cw6AAA1ZqYyaac405.png

1、登录对话框需求分析

    登录对话框需求分析:

    A、作为可复用的软件部件

    B、获取用户名和密码

    C、随机码验证

2、登录对话框的架构

    登录对话框的设计和架构

wKiom1gkmuTQjKM6AABS9adydrs861.png

对话框之间通过成员变量和成员函数传递数据,将用户数据保存在私有成员变量中,通过公有成员函数进行数据传递。

3、登录对话框类设计

#ifndef QLOGINDIALOG_H
#define QLOGINDIALOG_H
#include <QDialog>
#include <QLineEdit>
#include <QPushButton>
#include <QLabel>
class QLoginDialog: public QDialog
{
    Q_OBJECT
private:
    QLabel UserLabel;
    QLabel PwdLabel;
    QLineEdit UserEdit;
    QLineEdit PwdEdit;
    QPushButton B_Login;
    QPushButton B_Cancel;
    QString m_user;
    QString m_pwd;
public:
    QLoginDialog(QWidget *parent);
    QString getUser();
    QString getPwd();
    ~QLoginDialog();
private slots:
    void Login();
    void Cancel();
};
#endif // QLOGINDIALOG_H

实现文件:

#include "QLoginDialog.h"
#include <QDebug>
#include <QMessageBox>
 
QLoginDialog::QLoginDialog(QWidget *parent)
    :QDialog(parent, Qt::WindowCloseButtonHint), UserLabel(this),
PwdLabel(this),
      UserEdit(this), PwdEdit(this), B_Login(this),B_Cancel(this)
{
    UserLabel.setText("User ID:");
    UserLabel.move(50, 50);
    UserLabel.resize(60, 30);
    UserEdit.move(110, 50);
    UserEdit.resize(200, 30);
    PwdLabel.setText("Password:");
    PwdLabel.move(50, 100);
    PwdLabel.resize(60,30);
    PwdEdit.move(110, 100);
    PwdEdit.resize(200, 30);
    PwdEdit.setEchoMode(QLineEdit::Password);
    B_Login.setText("Login");
    B_Login.move(110, 150);
    B_Login.resize(80, 30);
    B_Cancel.setText("Cancel");
    B_Cancel.move(230, 150);
    B_Cancel.resize(80, 30);
    setWindowTitle("Login Window");
    setFixedSize(400, 300);
    connect(&B_Login, SIGNAL(clicked()), this, SLOT(Login()));
    connect(&B_Cancel, SIGNAL(clicked()), this, SLOT(Cancel()));
}
QString QLoginDialog::getUser()
{
    return m_user;
}
QString QLoginDialog::getPwd()
{
    return m_pwd;
}
void QLoginDialog::Login()
{
    qDebug() << "login";
    m_user = UserEdit.text().trimmed();
    m_pwd = PwdEdit.text();
    if(!(m_user.isEmpty() || m_pwd.isEmpty()))
    {
        done(Accepted);
    }
    else
    {
        QMessageBox mb(this);
        mb.setWindowTitle("Warning Message");
        mb.setIcon(QMessageBox ::Warning);
        mb.setText("User or PassWord can't empty! \nPlease check your username or password!");
        mb.setStandardButtons(QMessageBox::Ok);
        mb.exec();
    }
}
void QLoginDialog::Cancel()
{
    qDebug() << "cancel";
    done(Rejected);
}
QLoginDialog::~QLoginDialog()
{
}