0

先决条件:

我有一个自定义 QItemDelegate ,它为树视图项目创建自定义编辑器。编辑器由 QLineEdit 和 QToolButton 组成。该按钮用于打开文件对话框以选择文件并将其路径放入行编辑中。我使用对 QFileDialog::getOpenFileName 的调用来打开文件对话框。该对话框是本机 Windows 文件对话框(这很重要)。

第一次创建编辑器时,无论我多久按下该按钮,一切正常。但是在编辑器关闭并再次重新打开后,第一次按下按钮会导致崩溃。崩溃的原因是我的自定义编辑器最终被删除。

这是一些代码:

void CCustomEditor::on_RunSetupBtn_clicked()
{
    auto qFilename = QFileDialog::getOpenFileName(this,
        "Select application to run",
        QString(),
        "Executable files (*.exe)");

    if (qFilename.isEmpty())
        return;

    SetCommandLine(QDir::toNativeSeparators(qFilename), m_qParameters);
}
4

2 回答 2

0

我对 getOpenFileName 和 getSaveFileName 有类似的问题。我的解决方案是,在 getOpenFileName、getSaveFileName 之后或在函数结束时使用 activateWindow() 将窗口设置为活动状态。

于 2017-12-01T15:55:04.260 回答
0

我进行了一些挖掘,发现调用 WinAPI 函数 GetOpenFileName 的结果完全相同:我的编辑器被删除(尽管没有发生崩溃)。似乎 Qt 也在内部调用它。

我已经追踪了我的编辑器被删除的原因,并发现当调用 getOpenFileName 时,活动窗口会发生变化,并且焦点也会随之变化。在第一种情况下,焦点从 TreeView 项中移出,但在第二种情况下,焦点从编辑器本身中移出!这会导致由于“关注”事件而删除编辑器。

重要的是,如果在创建文件对话框时设置了“DontUseNativeDialog”标志,则不会发生这种情况。因此这应该是原生窗口和 Qt 小部件之间的 Qt 窗口管理中的一个错误。

作为此错误的解决方法,我建议使用以下解决方案:在调用 getOpenFileName 之前,将焦点设置为按钮本身。

    m_pUI->RunSetupBtn->setFocus();

    auto qFilename = QFileDialog::getOpenFileName(this,
            "Select application to run",
            QString(),
            "Executable files (*.exe)");

另一种解决方法是使用“DontUseNativeDialog”标志,但生成的文件对话框看起来不是原生的,实际上它非常难看。如果有人有更好的解决方案,请随时分享。

于 2016-07-19T10:48:32.647 回答