QT開發(二十)——QT對話框

QT開發(二十)——QT對話框

1、對話框簡介

對話框是與用戶進行簡短交互的頂層窗口架構

QDialog是QT中全部對話框窗口的基類,QDialog繼承於QWidget,是一種容器型的組件,是定製了窗口樣式的特殊QWidget。app

QDialog做爲一種專用的交互窗口,不能做爲子部件嵌入其餘容器中。ide

2、對話框類型

對話框類型分爲模態對話框和非模態對話框。函數

一、模態對話框

模態對話框顯示後沒法與父窗口進行交互,是一種阻塞式的對話框,使用QDialog::exec()函數調用。字體

模態對話框通常在棧上建立。this

    QDialog dialog(this);spa

    dialog.exec();設計

模態對話框適用於必須依賴用戶選擇的場合,好比消息顯示,文件選擇,打印設置等。orm

二、非模態對話框

非模態對話框顯示後獨立存在,能夠同時與父窗口進行交互,是一種非阻塞式對話框,使用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();

3、對話框的返回值

只有模態對話框採用返回值,模態對話框的返回值用於表示交互結果。

QDialog::exec()函數的返回值做爲交互結果。

void QDialog::done(int i)函數關閉對話框,並將參數做爲交互結果。

QDialog::Accepted表示用戶操做成功

QDialog::Rejected表示用戶操做失敗

 

4、標準對話框

1、標準對話框的類型

QT爲開發者提供了多種可複用的對話框類型,即QT標準對話框。QT標準對話框所有繼承於QDialog類。經常使用標準對話框類型以下:

wKioL1gkmhCzG1NuAADcnPdKIBA116.png

對話框對象的定義

QDialogType dialog(this);

對話框屬性設置

dialog.setPropertyxxxx(value);

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

{

Type v = dialog.getDialogValue();

}

二、消息對話框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)

三、文件對話框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)

 

四、顏色對話框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)

五、輸入對話框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)

六、字體對話框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)

七、進度對話框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

八、打印對話框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

5、窗體之間數據的傳遞

QT窗體之間數據的傳遞有三種方式:信號槽機制、公有函數接口、全局變量。

一、QT信號槽傳遞

在發送數據的窗體類中定義帶參數的信號,發送信號;在接收數據的窗體中定義接收數據的槽函數;將發送數據的信號和接收數據的槽函數鏈接。

聲明信號:

signals:  

    void sendData(QString);   

發送信號(帶參數內容):

emit sendData(lineEdit->text());

定義槽函數(帶參數內容):

private slots:  

   void receiveData(QString data); 

鏈接信號與槽:

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

二、公有函數接口傳遞

使用公有成員函數接口能夠在不一樣類外調用類的成員函數,返回須要的數據。

三、全局變量傳遞

全局變量能夠在一個文件中定義,其餘文件中聲明後使用,實現數據的共享傳遞。

6、登陸對話框實例

    登陸對話框是應用程序經常使用的部件。

wKioL1gkmsWC4Cw6AAA1ZqYyaac405.png

一、登陸對話框需求分析

    登陸對話框需求分析:

    A、做爲可複用的軟件部件

    B、獲取用戶名和密碼

    C、隨機碼驗證

二、登陸對話框的架構

    登陸對話框的設計和架構

wKiom1gkmuTQjKM6AABS9adydrs861.png

對話框之間經過成員變量和成員函數傳遞數據,將用戶數據保存在私有成員變量中,經過公有成員函數進行數據傳遞。

三、登陸對話框類設計

#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()
{
}
相關文章
相關標籤/搜索