先决条件:
我有一个自定义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);
}
答案 0 :(得分: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'标志,但生成的文件对话框看起来不是原生的,实际上它非常难看。 如果有人有更好的解决方案,请随时分享。
答案 1 :(得分:0)
我在getOpenFileName和getSaveFileName方面遇到了类似的问题。我的解决方案是,在getOpenFileName之后,getSaveFileName或在函数结束时使用activateWindow()将窗口设置为活动状态。