Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 运行QFileDialog::getOpenFileName而不运行单独的事件循环?_C++_Qt_Qt5_Fileopendialog_Qeventloop - Fatal编程技术网

C++ 运行QFileDialog::getOpenFileName而不运行单独的事件循环?

C++ 运行QFileDialog::getOpenFileName而不运行单独的事件循环?,c++,qt,qt5,fileopendialog,qeventloop,C++,Qt,Qt5,Fileopendialog,Qeventloop,我现在正在用。但是,正如中所建议的,当对话框打开时主应用程序关闭时,会崩溃。您可以在此处看到如何重现崩溃的示例: int main(int argc, char **argv) { QApplication application{argc, argv}; QMainWindow *main_window = new QMainWindow(); main_window->show(); QPushButton *button = new QPushButton("Pr

我现在正在用。但是,正如中所建议的,当对话框打开时主应用程序关闭时,会崩溃。您可以在此处看到如何重现崩溃的示例:

int main(int argc, char **argv) {
  QApplication application{argc, argv};

  QMainWindow *main_window = new QMainWindow();
  main_window->show();

  QPushButton *button = new QPushButton("Press me");
  main_window->setCentralWidget(button);

  QObject::connect(button, &QPushButton::clicked, [main_window]() {
    QTimer::singleShot(2000, [main_window]() { delete main_window; });

    QFileDialog::getOpenFileName(main_window, "Close me fast or I will crash!");
  });

  application.exec();
  return 0;
}
如前所述,我可以将
QFileDialog
与普通构造函数一起使用。但是,我似乎没有打开本机windows文件对话框


有没有办法获得一个不会崩溃的程序,并通过Qt使用本机Windows文件打开对话框?

应用程序的设计被破坏了。应用程序的关闭通常发生在主线程中最外层的事件循环存在时。当文件对话框处于活动状态时不会发生这种情况-根据定义,它的事件循环正在运行。因此,您正在做一些不应该做的事情,而文件对话框只是一个替罪羊,或者是煤矿中的一只金丝雀,指示其他地方的破碎。

如果您关闭
主窗口而不是删除它,您将不会得到任何崩溃

顺便说一下,您可以检查是否打开了
QFileDialog
,以避免错误的应用程序退出

在下一个示例中,我将关闭对话框,但您可以实现另一个解决方案:

#include <QTimer>
#include <QApplication>
#include <QMainWindow>
#include <QPushButton>
#include <QFileDialog>
#include <QDebug>

int main(int argc, char **argv) {
  QApplication application{argc, argv};

  QMainWindow *main_window = new QMainWindow();
  main_window->show();

  QPushButton *button = new QPushButton("Press me");
  main_window->setCentralWidget(button);

  QObject::connect(button, &QPushButton::clicked, [main_window]() {
    QTimer::singleShot(2000, [main_window]() {

        QObjectList list = main_window->children();

        while (!list.isEmpty())
        {
            QObject *object= list.takeFirst();

            if (qobject_cast<QFileDialog*>(object))
            {
                qDebug() << object->objectName();
                QFileDialog* fileDialog = qobject_cast<QFileDialog*>(object);
                fileDialog->close();
            }
        }

        main_window->close();
    });

    QFileDialog::getOpenFileName(main_window, "Close me fast or I will crash!");
  });

  application.exec();
  return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,字符**argv){
QApplication应用程序{argc,argv};
QMainWindow*主窗口=新QMainWindow();
主窗口->显示();
QPushButton*按钮=新的QPushButton(“按我”);
主窗口->设置中心Widget(按钮);
QObject::connect(按钮,&QPushButton::单击,[主窗口](){
QTimer::singleShot(2000,[主窗口](){
QObjectList list=主窗口->子窗口();
而(!list.isEmpty())
{
QObject*object=list.takeFirst();
if(qobject_cast(对象))
{
qDebug()objectName();
QFileDialog*fileDialog=qobject\u cast(对象);
文件对话框->关闭();
}
}
主窗口->关闭();
});
QFileDialog::getOpenFileName(主窗口,“快速关闭我,否则我将崩溃!”);
});
application.exec();
返回0;
}

对话框打开时,为什么主应用程序关闭?你不能阻止它吗?不,有一个单独的线程正在运行,可能会抛出错误。在这种情况下,应用程序将关闭,所有窗口小部件将被销毁。这可以正常工作(调用所有正确的析构函数等),但仍在运行的getOpenFileName除外。是否分配了父级?-如果有任何明显的错误,不妨发布调用对话框的代码:据我所知,当您调用“exec”时,filedialog将与所有对话框一样,并启动自己的内部事件循环,另请参见::“这可能是讨厌的bug的来源:(几乎)在exec()之前任何事情都可能发生返回,外部事件(计时器、网络、IPC等)可以调用插槽,导致出现其他对话框等。J“谢谢,好主意!虽然它看起来确实有点粗糙的铸造…;)@JanRüegg嗯,是的:D这只是一个例子:D在任何情况下,
main_window->close()是这里的关键。