gpt4 book ai didi

qt - 如何将 QDialog 粘贴到自定义委托(delegate)中?

转载 作者:行者123 更新时间:2023-12-03 06:21:44 29 4
gpt4 key购买 nike

当您创建自己的自定义委托(delegate)时,您可以实现 createEditor()setEditorData()setModelData()。我面临以下问题。我见过的所有 createEditor() 示例都使用简单的东西,例如 QComboBox 或 QLineEdit,它们没有 show()exec() 成员函数,每当我尝试使用 QDialog 时,程序都有未定义的行为(我认为)并且 QDialog 出现但行为疯狂。我确实使用一些信号/槽魔法让我的程序正常工作,但我想使用描述的标准模式来实现它,例如,这里: http://cep.xray.aps.anl.gov/software/qt4-x11-4.2.2/model-view-delegate.html我该怎么做?

为了详细说明当我面对未定义的行为时会发生什么,如果我在 createEditor() 中设置 QDialog 的父级,那么 QDialog 根本不会显示,如果我不设置它,它会显示,然后当我拖动时它周围的它消失了(无论如何这是错误的,我认为我必须始终设置父级,否则我会出现内存泄漏)。我想,现在我的问题归结为:如何让 QDialog 正确显示?我尝试将 show() 和 exec() 粘贴到 setEditorData()、setModelData() 和 createEditor() 的不同部分,但没有任何效果正常。

最佳答案

编辑器委托(delegate)必须是嵌入 View 中的小部件。当然,如果愿意的话,可以自由地创建顶级窗口,但它必须适本地控制该窗口的可见性和焦点。也就是说,如果编辑器小部件的可见性发生变化,对话框的可见性也必须发生变化,并且如果编辑器小部件获得焦点,则必须将焦点转移到对话框以获得良好的用户体验。

解决方案是有一个空的QWidget,它有一个作为顶级窗口的子QDialog:

QWidget * MyDelegate::createEditor(QWidget * parent, 
const QStyleOptionViewItem &, const QModelIndex & index) const
{
auto editor = new QWidget{parent};
auto dialog = new QDialog{editor, Qt::Window};
...
return editor;
}

您的QDialog编辑器无法工作的原因是它的几何形状和状态是由 View 管理的。该 View 就像编辑/代表的布局。您需要插入一个中间小部件来保护您的对话框免受此类操作。诚然,如果设置了 Qt::Window 标志, View 可以检查编辑器的标志并避免调整几何图形等,但这种情况非常罕见,我不会责怪任何人不实现它。当然,您可以随意提交对 Qt 的更改!

关于qt - 如何将 QDialog 粘贴到自定义委托(delegate)中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40264262/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com