[英]QMessageBox and QFileDialog in a loop
如果設置了項目路徑,我有一個程序需要在啟動時檢查。 為此,我對QMessageBox
進行了子類化,添加了一些自定義內容(例如使對話框更寬的間隔器),並且我正在調用QFileDialog::getExistingDirectory
來獲取目錄。
問題是,用戶可以在QFileDialog
單擊 Cancel 。 但我希望用戶返回到QMessageBox
有另一個機會設置路徑或完全退出程序。 為了實現這一點,我編寫了方法loop()
:
CustomMessageBox::loop()
{
while (true) {
this->exec();
if (this->clickedButton() == setPathButton) {
path = QFileDialog::getExistingDirectory(...);
if (!path.isEmpty()) { break; }
} else if (this->clickedButton() == quitButton) {
break;
}
}
}
然后,我有一個方法getPath()
:
CustomMessageBox::getPath()
{
loop();
return path;
}
我在main.cpp
調用它:
CustomMessageBox box;
QString path = box.getPath();
if (!path.isEmpty()) {
// save path, bla, bla
} else {
exit(EXIT_FAILURE)
}
這有效,但這是一個好習慣嗎? 我特別詢問這個while
里面駐留方法exec()
。
您決定的 IMO 缺點:
exec()
方法,此時該方法可以很容易地以標准方式調用。exec()
調用getPath()
方法的雙重甚至三重目的:
我建議繼承QDialog
(為什么是消息框?):
在 Degister 中,我采用了標准的 Push Button setPathButton
和 Dialog Button Box buttonBox
。 然后我從框中刪除了“確定”按鈕:
#include <QtWidgets/QDialog>
#include "ui_CustomDialog.h"
class CustomDialog : public QDialog
{
Q_OBJECT
public:
CustomDialog(QWidget *parent = nullptr);
QString path() const { return m_path; };
private slots:
void on_setPathButton_clicked();
void on_buttonBox_rejected(); // You can use any pushButton instead: on_closeButton_clicked()
private:
Ui::CustomDialogClass ui;
QString m_path;
};
...
#include "CustomDialog.h"
#include <QFileDialog>
CustomDialog::CustomDialog(QWidget *parent)
: QDialog(parent)
{
ui.setupUi(this);
}
void CustomDialog::on_setPathButton_clicked()
{
m_path.clear();
QString dir = QFileDialog::getExistingDirectory();
if (!dir.isEmpty())
{
m_path = dir;
done(QDialog::Accepted);
}
}
// You can use any pushButton instead: void on_closeButton_clicked()
void CustomDialog::on_buttonBox_rejected()
{
reject();
}
主程序
#include "CustomDialog.h"
#include <QtWidgets/QApplication>
#include <QDebug>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
CustomDialog box;
int code = box.exec();
if (code == QDialog::Accepted)
{
qDebug() << box.path();
// save path, bla, bla
}
else
{
exit(EXIT_FAILURE);
}
return a.exec();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.