【问题标题】:getOpenFileNames dialog is not centered to the main windowgetOpenFileNames 对话框未以主窗口为中心
【发布时间】:2023-12-19 23:34:01
【问题描述】:

为什么打开的对话框没有以主窗口为中心?

void MainWindow::on_FileOpenAction_triggered()
{
    QStringList fileNames = QFileDialog::getOpenFileNames(
        this, 
        "Open Image",
        QApplication::applicationDirPath(), 
        "Images (*.jpg);;All Files (*.*)"
    );
}

文档说应该可以:

此函数使用给定的父窗口小部件创建一个模态文件对话框。如果 parent 不为 0,则对话框将显示在父窗口的中心。

我在 Windows XP SP2 上使用 QT 4.6.3。

【问题讨论】:

    标签: qt qt4 centering fileopendialog opendialog


    【解决方案1】:

    documentation 中还有以下内容:

    在 Windows 上,对话框将旋转一个阻塞模式事件循环,它不会调度任何 QTimer,如果 parent 不为 0,那么它将把对话框定位在父标题栏的正下方。

    这是怎么回事?如果没有,我猜你在 Qt 中发现了一个错误。

    【讨论】:

    • 这正是正在发生的事情。有没有办法避免它。我想我应该尝试构建对话框,而不是使用 hendy 助手 getOpenFileNames() 例程。
    • @Gad D Lord:我知道的唯一方法是跳过辅助程序并自己定位对话框。
    【解决方案2】:

    Qt 中存在错误或文档中存在错误。 如果您想要一个居中的对话框,请避免使用静态函数并以这种方式创建对话框:

    QFileDialog dialog(
        this, 
        "Open Image",
        QApplication::applicationDirPath(),
        "Images (*.jpg);;All Files (*.*)");
    dialog.setFileMode(QFileDialog::ExistingFiles);
    QStringList fileNames;
    if (dialog.exec())
        fileNames = dialog.selectedFiles();
    

    请注意,这使用的是 Qt 的文件对话框,而不是本机文件对话框。

    【讨论】:

    • 我想以本机为中心的解决方案没有选择。除了帖子之外的任何方式。