设计师

时间:2015-07-30 08:05:26

标签: c++ qt plugins widget designer

我现在已经工作了一段时间,为GUI菜单创建了一个QT自定义设计器小部件。想法是你只需将它拖到设计器中,选择你想要的帧数,每帧有多少个按钮等等,它会为你生成和调整大小。

构建窗口小部件的方式有属性来配置您所在框架的每个按钮。例如,您将使用button0Text字段在第0帧中编辑时在Button0下输入文本,然后再次使用它来编辑Button0这两个按钮将保留每个帧的各个更改。

enter image description here

问题

通常,当我切换帧时,我的所有属性都会更新以反映帧的状态。唯一的例外是QIcon。正确的图标保留在实际的图形表示中并正确构建,但属性列表中的文件路径始终是该属性的最后编辑。我认为这对最终用户来说会非常混乱,我找不到解决方法。因此,例如,如果我在第0帧中设置文本和图标,然后切换到第1帧,属性列表中的文本将更新以反映第1帧的状态,但图标路径名仍将显示我在帧0中的最后一次编辑,而不是第1帧中的实际图标。

我尝试过简单的事情:

setProperty("button0Icon", getButton0Icon());

该代码适用于文本等属性,但不适用于图标。我在更改帧后立即尝试执行它。

我也尝试过:

#ifndef Q_WS_QWS
QDesignerFormWindowInterface *form = QDesignerFormWindowInterface::findFormWindow(this);
if(form){
    QDesignerFormEditorInterface *editor = form->core();
    QExtensionManager *manager = editor->extensionManager();
    QDesignerPropertySheetExtension *sheet;
    sheet = qt_extension<QDesignerPropertySheetExtension*>(manager, this);
    int propertyIndex = sheet->indexOf("button0Icon");
    sheet->setChanged(propertyIndex, true);
    sheet->setProperty(propertyIndex, getButton0Icon());
}
#endif

int propertyIndex = this->metaObject()->indexOfProperty("button0Icon");
QMetaProperty property = this->metaObject()->property(propertyIndex);
property.write(this, QIcon());

似乎没有更新设计器中的属性列表。

我拥有所有属性,包括使用Q_PROPERTY在头文件中正确声明的所有QIcon属性,并分配了getter和setter函数。

要清楚,编译时,每个帧确实保留了图标值。所以它正在发挥作用,对大多数用户来说还不清楚。

如果有任何人对此或任何想法有任何经验,请告诉我。感谢。

1 个答案:

答案 0 :(得分:0)

我发现QIcon不存储文件名/路径。文件名仅用于创建QIcon。我认为这很可能是因为我没有在属性浏览器中获得我的QIcon属性的任何反馈。

相反,我选择在设计器中隐藏此属性并添加三个新属性。三个QUrl属性,每个属性用于提供图像文件。我使用三个因为我想构建一个QIcon,其中包含正常,禁用和按下操作的模式/状态。

我将这些QUrls中的每一个都保存在幕后的QStringLists中,以便存储它们的值。然后,我使用QUrls提供的文件名构建我的QIcon。

我更倾向于在设计师中使用原生QIcon,感谢任何想法或反馈。