QFileDialog из дочернего окна закрывает приложение - PullRequest
0 голосов
/ 25 января 2019

Я новичок в QT и у меня возникают проблемы при вызове QFileDialog из дочернего окна.Мое приложение относительно простое.У меня есть один быстрый виджет, который получает пользовательский ввод, а затем запускает шоу на его родителя.Это мой главный.

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);

    ParentWidjet w(nullptr);

    ChildWidget input(&w);
    input.show();

    return a.exec();
}

Это соответствующий раздел дочернего виджета:

ChildWidget::ChildWidget(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::InputPrompt){
    ui->setupUi(this);
    this->setParent(parent);
}
...
void ChildWidget::on_imagesSelect_clicked() {
    inputFilepath = QFileDialog::getExistingDirectory(static_cast<ParentWidget *>(this->parent()), QCoreApplication::translate("main", "Open directory"), "./", QFileDialog::ShowDirsOnly);
    ui->inputPath->setPlainText(inputFilepath);
    std::cout << "y u exit" << std::endl;
}
//Setup and show the parent
void ChildWidget::on_buttonBox_accepted() {
    static_cast<ParentWidjet *>(this->parent())->setup(inputFilepath, outputFilepath);
    static_cast<ParentWidjet *>(this->parent())->show();
}

По какой-то причине, когда вызывается QFileDialog, закрыв его либо OKили Cancel закрывает как родителя, так и ребенка.Если я не использую его, но нажимаю кнопку «ОК» дочернего элемента, который вызывает функцию on_buttonBox_accepted(), дочерний элемент закрывается, и родительский виджет отображается, как и ожидалось.Если я не передам родительский виджет дочернему виджету в основном, QFileDialog больше не закрывает дочерний виджет при запуске.Я попытался изменить родителя QFileDialog на this или nullptr, но это не помогло.

Я думаю, мой вопрос похож на QFileDialog закрывает окно при вызове

или PyQt5 QFileDialog завершает приложение при вызове из дочернего окна

Но я не могу извлечь из них решение, которое работает для меня.

1 Ответ

0 голосов
/ 18 февраля 2019

Короче говоря, второе окно не отображается, и нет никаких действий, ожидающих приема вызова подтверждения, поэтому мое приложение просто умирает.Этого можно избежать, если свойство выхода из последнего закрытого окна имеет значение отключено .Форумы Qt предложили решение вместе с несколькими лучшими вариантами дизайна.Это то, с чем я пошел в конце.

int main(int argc, char *argv[]) {
   QApplication a(argc, argv);

   ParentWidget w(nullptr);

   ChildWidget input;
   if (  input.exec() == QDialog::accepted)   // exec() blocks execution until ok/cancel. unlike show()
   {
     w.setup(input.inputFilepath, input.outputFilepath); // assuming these are public
     w.show()
   } else 
   {  // user closed or pressed cancelled
     ... what u want to do..
   }

    return a.exec();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...