QMessageBox и QFileDialog в цикле - PullRequest
       0

QMessageBox и QFileDialog в цикле

0 голосов
/ 20 февраля 2020

У меня есть программа, которая должна при запуске проверять, задан ли путь к проекту. Для этого я вложил в подкласс QMessageBox, добавил несколько пользовательских вещей (например, пробел, чтобы сделать диалог шире), и я звоню QFileDialog::getExistingDirectory, чтобы получить каталог.

Дело в том, что пользователь может нажать Отмена в QFileDialog. Но я хочу, чтобы пользователь вернулся на 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().

1 Ответ

1 голос
/ 21 февраля 2020

ИМО недостатки вашего решения:

  1. Нестандартное использование диалогового класса. Поместите странный l oop в некоторый GUI метод и вызовите стандартный метод exec() внутри него, когда метод легко может быть вызван стандартным способом.
  2. Hide exec() call from "user" ( другой программист)
  3. Двойное или даже тройное назначение одного метода getPath():
    • показ диалога
    • признак того, что диалог был принят / отклонен через пустое значение - не - пустая строка
    • возвращать строку пути к каталогу

Я предлагаю наследовать QDialog (почему окно сообщения?):

В Degister I наденьте стандартную форму Pu sh Button setPathButton и диалоговую кнопку Box buttonBox. Затем я удалил из окна кнопку «ОК»:

enter image description here

#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();
}

основной. cpp

#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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...