运行 QFileDialog::getOpenFileName 没有单独的事件循环?
Run QFileDialog::getOpenFileName without separate event loop?
我正在使用 QFileDialog::getOpenFileName right now. However, as suggested in this article,当对话框打开时主应用程序关闭时会崩溃。您可以在此处查看如何重现崩溃的示例:
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
与普通构造函数一起使用,如 here 所述。但是,我似乎没有得到原生的 windows 文件打开对话框。
有没有办法获得一个不会崩溃的程序并通过 Qt 使用本机 Windows 文件打开对话框?
您的应用程序设计有问题。应用程序的关闭通常发生在主线程中最外层的事件循环存在时。当文件对话框处于活动状态时,这不会发生 - 根据定义,它的事件循环是 运行 然后。因此,您正在做不应该做的事情,而文件对话框只是替罪羊,或者煤矿中的金丝雀,表明其他地方已损坏。
如果您关闭 main_window
而不是删除它,您将不会遇到任何崩溃。
对了,你可以检查一下有没有QFileDialog
打开,避免app退出错误
在下一个示例中,我将关闭对话框,但您可以实施另一个解决方案:
#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;
}
我正在使用 QFileDialog::getOpenFileName right now. However, as suggested in this article,当对话框打开时主应用程序关闭时会崩溃。您可以在此处查看如何重现崩溃的示例:
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
与普通构造函数一起使用,如 here 所述。但是,我似乎没有得到原生的 windows 文件打开对话框。
有没有办法获得一个不会崩溃的程序并通过 Qt 使用本机 Windows 文件打开对话框?
您的应用程序设计有问题。应用程序的关闭通常发生在主线程中最外层的事件循环存在时。当文件对话框处于活动状态时,这不会发生 - 根据定义,它的事件循环是 运行 然后。因此,您正在做不应该做的事情,而文件对话框只是替罪羊,或者煤矿中的金丝雀,表明其他地方已损坏。
如果您关闭 main_window
而不是删除它,您将不会遇到任何崩溃。
对了,你可以检查一下有没有QFileDialog
打开,避免app退出错误
在下一个示例中,我将关闭对话框,但您可以实施另一个解决方案:
#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;
}