目錄
子產品對話框:
非子產品對話框:
标準對話框
問題對話框:
檔案對話框:
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();
}
标準對話框
預先設定有一些按鈕的模闆,可以按以下方式檢視各種标準對話框:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CXwcmeORTVE9EeRpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2LcRHelR3LcJzLctmch1mclRXY39DMxUzNxgDM1ETNxkDM4EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
選擇的時候注意枚舉類型和函數的差別
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;
}
);
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()
{
}