文章目錄

  • 前言
  • 一、QDialog模態和非模態?
  • 二、QMessageBox消息對話框
  • 1.錯誤(critical)
  • 2.警告(warning)
  • 3.信息(information)
  • 4.問題(question)
  • 三、QFileDialog文件對話框

前言

本篇文章主要講QDialog對話框以及QMessageBox和QFileDialog

一、QDialog模態和非模態?

説明:模態是指打開對話框後無法操作主程序的其他界面,必須先處理對話框。非模態是指可以處理主程序的其他內容,不必先處理對話框。下面我通過具體例子演示:

首先創建UI界面,如下;

QDialog keyPressEvent 無響應_#c++


創建好後,將Model和NonModel轉到槽,在連接信號與槽:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QDialog>
#include <QPushButton>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 信號與槽:connect(object1, SIGNAL(signal), object2, SLOT(slot))
    connect(ui->actionModel, SIGNAL(triggered()), this, SLOT(dialog_Model()));
    connect(ui->actionNoModel, SIGNAL(triggered()), this, SLOT(dialog_NoModel()));
}

MainWindow::~MainWindow()
{
    delete ui;
}

// dialog_model 槽函數
void MainWindow::dialog_Model()
{
    QDialog dia_model(this);
    qDebug() << "hello dialog_model";

    // Model 使用exec,模態對話框,(彈出對話框後,必須對此對話框進行操作,否則不能操作其他同程序的頁面)
    dia_model.exec();
}

// dialog_nomodel 槽函數
void MainWindow::dialog_NoModel()
{
    QDialog *dia_nomodel = new QDialog(this);
    // 關閉對話框時自動釋放內存
    dia_nomodel->setAttribute(Qt::WA_DeleteOnClose);

    // NoModel 使用show,非模態對話框,(彈出對話框,不是必須對次進行操作)
    dia_nomodel->show();
    qDebug() << "hello dialog_nomodel";

}

需要注意的是,模態和非模態創建對象的方法不同,在創建非模態時,還需要設置對話框關閉後內存自動釋放,不然容易造成內存使用增大。

使用如下代碼釋放內存
dia_nomodel->setAttribute(Qt::WA_DeleteOnClose);

二、QMessageBox消息對話框

説明:消息對話框主要有:錯誤,警告,信息,問題等。
下面我主要講這四個

1.錯誤(critical)

還是需要創建UI界面,創建好後,將其轉到槽,以下其他三種都需要

// 這裏我只寫槽函數
void MainWindow::on_actionCritical_triggered()
{
    // 返回值為int
    QMessageBox::critical(this, "錯誤", "critical");
}

注意這裏不需要new一個對象,返回值為int型,可以通過返回值判斷是否正確執行,在Qt的幫助文檔中有。

QDialog keyPressEvent 無響應_#qt_02

2.警告(warning)

代碼如下:

void MainWindow::on_actionWarning_triggered()
{

    // 返回值為int
    QMessageBox::warning(this, "警告", "warning");
}

跟critical是差不多的

QDialog keyPressEvent 無響應_#c++_03

3.信息(information)

跟上面兩種差不多

void MainWindow::on_actionInfo_triggered()
{
    // 返回值為int
    QMessageBox::information(this, "信息", "information");
}

QDialog keyPressEvent 無響應_#qt_04

4.問題(question)

這裏是引用

void MainWindow::on_actionQuestion_triggered()
{
    // 返回值為int類型
    if (QMessageBox::Ok == QMessageBox::question(this, "問題", "你有對象嗎?",
                          QMessageBox::Ok | QMessageBox::Cancel))
    {
        qDebug() << "返回了ok";
    }
    else {
        qDebug() << "返回了cancel";
    }


}

可以自定義問題的內容以及按鈕,以上三種也能自定義按鈕,每個按鈕的返回值都不一樣,可以查Qt文檔查看。這裏我們將按下的按鈕返回值與其進行判斷,方便觀察。

QDialog keyPressEvent 無響應_#qt_05

説明一下:以上四種對話框都是模態的

三、QFileDialog文件對話框

文件對話框有很多種操作(如保存,打開等),我主要將打開操作

void MainWindow::on_actionQFileDialog_triggered()
{
    QFileDialog::getOpenFileName(this, "打開文件");
}
第三個參數是可以設置路徑,第四個參數可以設置選擇文件格式(如:png, jpg, doc, all),這裏我沒有演示

QDialog keyPressEvent 無響應_#學習_06