天天看點

Qt學習(4)——标準對話框和檔案對話框

目錄

子產品對話框:

非子產品對話框:

标準對話框

問題對話框:

檔案對話框:

codes:

對話框分為非子產品和子產品對話框:差別在于是否隻在目前視窗操作。

首先設定菜單:

QMenuBar *mBar = menuBar();
    setMenuBar(mBar);//設定一下菜單欄,但沒有這一行好像也行
    QMenu *menu = mBar->addMenu("對話框");
    QAction *a1 = menu->addAction("模态對話框");
           

子產品對話框:

QAction *a1 = menu->addAction("模态對話框");
    
    connect(a1, &QAction::triggered,
            [=]()
            {
                QDialog dlg;//建立對話框
                dlg.exec();//等待使用者操作
                //qDebug()<<"111";
            }
                
           );
           

非子產品對話框:

QAction *a2 = menu->addAction("非模态對話框");
    
    connect(a2, &QAction::triggered,
            [=]()
            {
                QDialog dlg;//建立對話框
                dlg.show();
                qDebug()<<"111";
            }
                
           );
           

這時會發現根本沒有對話框出現,因為dlg的生命周期隻在表達式内。

要想解決這個問題:1)設定成員變量 ,生命周期與主程式一緻  2)動态配置設定空間 new 程式結束時釋放。

但是第二種方法又個有問題,如果該按鈕點選多次,記憶體越占越多;雖然可以不指定父對象解決,但是不指定父對象又無法自動釋放,隻能手動釋放。

但又可以通過設定屬性解決。

解決方法:

connect(a2, &QAction::triggered,
            [=]()
            {
//                QDialog dlg;//建立對話框
//                dlg.show();
//                qDebug()<<"111";
                QDialog *p = new QDialog(this);
                p->setAttribute(Qt::WA_DeleteOnClose);//關閉時釋放
                p->show();
            }
           

标準對話框

預先設定有一些按鈕的模闆,可以按以下方式檢視各種标準對話框:

Qt學習(4)——标準對話框和檔案對話框

選擇的時候注意枚舉類型和函數的差別

QAction *a3 = menu->addAction("關于對話框");

    connect(a3, &QAction::triggered,
            [=]()
            {
                QMessageBox::about(this,"about","關于Qt");//标題和内容
            }

           );
           
Qt學習(4)——标準對話框和檔案對話框

問題對話框:

可以有兩個選項,對不同的選項進行不同處理;

檢視傳回值的參數值:

Qt學習(4)——标準對話框和檔案對話框
Qt學習(4)——标準對話框和檔案對話框
QAction *a4 = menu->addAction("問題對話框");

    connect(a4, &QAction::triggered,
            [=]()
            {
                int ret = QMessageBox::question(this,"question","是否儲存?");
                //也可以指定選擇項:
                /*int ret = QMessageBox::question(this,,"question","是否儲存?",
                                                QMessageBox::Ok |
                                                    QMessageBox::Cancel
                                                );*/
                switch(ret)
                {
                    case QMessageBox::Yes:
                        qDebug() << "i am OK";
                        break;
                    case QMessageBox::No:
                        qDebug() << "i am bad";
                        break;
                    default:
                        break;
                }
            }
           );
           

檔案對話框:

QAction *a5 = menu->addAction("檔案對話框");

    connect(a5, &QAction::triggered,
            [=]()
            {
                QString path = QFileDialog::getOpenFileName(
                            this,       //父對象
                            "open",     //
                            "../",   //上級目錄
                            "source(*.cpp *.h);;"    //篩選檔案類型
                            "Text(*.txt);;all(*.*)"
                            );//字元串可以換行,qt補全,自動連接配接
                qDebug() << path;
            }
           );
           

codes:

#include "mainwindow.h"
#include <QMenuBar>
#include <QMenu>
#include <QAction>
//對話框
#include <QDialog>
#include <QDebug>
//标準對話框
#include <QMessageBox>
//檔案對話框
#include <QFileDialog>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    QMenuBar *mBar = menuBar();
    setMenuBar(mBar);//設定一下菜單欄,但沒有這一行好像也行
    QMenu *menu = mBar->addMenu("對話框");
    QAction *a1 = menu->addAction("模态對話框");

    connect(a1, &QAction::triggered,
            [=]()
            {
                QDialog dlg;//建立對話框
                dlg.exec();//等待使用者操作
                //qDebug()<<"111";
            }

           );

    QAction *a2 = menu->addAction("非模态對話框");

    connect(a2, &QAction::triggered,
            [=]()
            {
//                QDialog dlg;//建立對話框
//                dlg.show();
//                qDebug()<<"111";
                QDialog *p = new QDialog(this);
                p->setAttribute(Qt::WA_DeleteOnClose);//關閉時釋放
                p->show();
            }

           );

    QAction *a3 = menu->addAction("關于對話框");

    connect(a3, &QAction::triggered,
            [=]()
            {
                QMessageBox::about(this,"about","關于Qt");//标題和内容
            }

           );


    QAction *a4 = menu->addAction("問題對話框");

    connect(a4, &QAction::triggered,
            [=]()
            {
                int ret = QMessageBox::question(this,"question","是否儲存?");
                //也可以指定選擇項:
                /*int ret = QMessageBox::question(this,,"question","是否儲存?",
                                                QMessageBox::Ok |
                                                    QMessageBox::Cancel
                                                );*/
                switch(ret)
                {
                    case QMessageBox::Yes:
                        qDebug() << "i am OK";
                        break;
                    case QMessageBox::No:
                        qDebug() << "i am bad";
                        break;
                    default:
                        break;
                }
            }
           );

    QAction *a5 = menu->addAction("檔案對話框");

    connect(a5, &QAction::triggered,
            [=]()
            {
                QString path = QFileDialog::getOpenFileName(
                            this,       //父對象
                            "open",     //
                            "../",   //上級目錄
                            "source(*.cpp *.h);;" //篩選檔案類型
                            "Text(*.txt);;all(*.*)"
                            );//字元串可以換行,qt補全,自動連接配接
                qDebug() << path;
            }
           );


}

MainWindow::~MainWindow()
{

}