Qt中常用的對話方塊總結QDialog

readyao發表於2015-11-30

一般對話方塊和QWidget看起來差別不大,不過還是有不同點的;

1.模態對話方塊,在模態對話方塊中,exec有自己的訊息迴圈;並且把app的訊息迴圈接管了;也就是當顯示該對話方塊的時候不能去點選其它視窗部件;

2.如果Dialog通過exec來顯示,那麼可以通過accept或者reject來關閉視窗
   如果Dialog通過show來顯示,那麼可以通過close來關閉視窗,這個和QWidget是一樣的;
   有許多的特殊dialog;列印預覽,檔案選擇,messagebox, 顏色選擇,字型選擇,列印;//這些對話方塊都是系統的對話方塊

3.相同之處包括都可以在部件上面用QPainter畫;


mydialog.h

#ifndef MYDIALOG_H
#define MYDIALOG_H

#include <QDialog>

class MyDialog : public QDialog
{
    Q_OBJECT
public:
    explicit MyDialog(QWidget *parent = 0);
    void paintEvent(QPaintEvent *);
    QString _strDir;//開啟的目錄,如果是空的,那麼開啟當前專案所在資料夾

signals:
    
public slots:
    void slotButtonClick();
};

#endif // MYDIALOG_H

mydialog.cpp


#include "mydialog.h"
#include <QPushButton>
#include <QDebug>
#include <QFileDialog>//檔案對話方塊
#include <QFileInfo>
#include <QCalendarWidget>
#include <QColorDialog>//顏色選擇對話方塊
#include <QFontDialog>//字型對話方塊
#include <QMessageBox>//訊息對話方塊
#include <QPainter>

MyDialog::MyDialog(QWidget *parent) :
    QDialog(parent)
{
    QPushButton * button = new QPushButton("Click me", this);
    button->setGeometry(150, 100, 80, 30);
    connect(button, SIGNAL(clicked()), this, SLOT(slotButtonClick()));

}

void MyDialog::slotButtonClick()
{
#if 0
    QDialog *dig = new QDialog();
    int ret;
    QPushButton  *button = new QPushButton(dig);
    //connect(button, SIGNAL(clicked()), dig, SLOT(accept()));//傳送accept訊號,來關閉視窗
    connect(button, SIGNAL(clicked()), dig, SLOT(reject()));//傳送reject訊號,來關閉視窗

/*
如果Dialog通過exec來顯示,那麼可以通過accept或者reject來關閉視窗
如果Dialog通過show來顯示,那麼可以通過close來關閉視窗,這個和QWidget是一樣的;
有許多的特殊dialog;列印預覽,檔案選擇,messagebox, 顏色選擇,字型選擇,列印;//這些對話方塊都是系統的對話方塊
*/

    ret = dig->exec();


    if(ret == QDialog::Accepted){
        qDebug() << "Accepted";
    }
    if(ret == QDialog::Rejected){
         qDebug() << "Rejected";
    }
   // dig.exec();//模態對話方塊,在模態對話方塊中,exec有自己的訊息迴圈;並且把app的訊息迴圈接管了;
#endif

#if 0
    //儲存檔案的對話方塊
    QString filename = QFileDialog::getSaveFileName(NULL, "select a file to save", _strDir, "Png file(*png)");
#endif

#if 0
    QString filename = QFileDialog::getOpenFileName(NULL, "select a directory to open", _strDir, "Png file(*png)");
#endif
#if 0
    QString filename = QFileDialog::getExistingDirectory();
    if(filename.isEmpty()){
        //沒有選擇
        return;
    }
    qDebug() << filename << endl;
    QFileInfo fileInfo(filename);
    _strDir = fileInfo.filePath();
#endif
#if 0
    QColorDialog colorDialog;
    colorDialog.exec();
    QColor color = colorDialog.selectedColor();
    qDebug() << color;
#endif

#if 0
    QFontDialog fontDialog;
    fontDialog.exec();
    QFont font = fontDialog.selectedFont();
    qDebug() << font;
#endif
#if 0
    QMessageBox::warning(this, "Error", "Error mesg...");
#endif
#if 0
    QMessageBox::critical(this, "Critical", "Critical error..");
#endif
    int ret = QMessageBox::question(this, "this", "realy do.....", QMessageBox::Yes | QMessageBox::No | QMessageBox::YesToAll| QMessageBox::NoAll);//還可以新增選項
    if (ret == QMessageBox::No){
        qDebug() << "No";
    }
    if(ret == QMessageBox::Yes){
         qDebug() << "Yes";
    }
    if(ret == QMessageBox::YesToAll){
         qDebug() << "YesToAll";
    }
}

/*畫Dialog部件,和Widget是一樣的*/
void MyDialog::paintEvent(QPaintEvent *)
{
    QPainter p(this);
    p.setPen(Qt::red);
    p.drawLine(QPointF(10, 10), QPointF(50, 50));
    p.setBrush(Qt::yellow);
    p.drawRect(QRect(100, 140, 200, 200));
}


#include <QApplication>
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    MyDialog d;
    d.setGeometry(400, 300, 400, 400);
    d.show();


    app.exec();
}

1.新的對話方塊

2.儲存檔案的對話方塊

3.開啟檔案的對話方塊

4.顏色選擇對話方塊

5.字型選擇對話方塊

6.警告提示對話方塊

7.嚴重錯誤警告

8.詢問對話方塊

9.用QPainter繪製的視窗(一條線,一個矩形)


相關文章