设计器中自定义小部件的 QT QIcon 属性

QT QIcon properties for custom widget in designer

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

小部件的结构方式有一些属性可以为您所在的框架配置每个按钮。例如,您可以使用 button0Text 字段在第 0 帧编辑时在 Button0 下输入文本,然后再次使用它来编辑第 1 帧中的 Button0。两个按钮将保留每个帧的单独更改。

问题

通常当我切换框架时,我的所有属性都会更新以反映框架的状态。 QIcon 是个例外。正确的图标保留在实际的图形表示中并正确构建,但是 属性 列表中的文件路径始终是该 属性 的最后编辑的。我认为这会让最终用户非常困惑,而且我找不到修复它的方法。因此,例如,如果我在第 0 帧中设置文本和图标,然后切换到第 1 帧,属性 列表中的文本将更新以反映第 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 正确声明并分配了 getter 和 setter 函数的所有 QIcon 属性。

需要说明的是,图标值在编译时确实保留在每一帧中。所以它正在运行,只是大多数用户不清楚。

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

我发现 QIcon 不存储文件 names/paths。文件名仅用于创建 QIcon。我认为这很可能是我在 属性 浏览器中没有收到关于我的 QIcon 属性的任何反馈的原因。

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

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

为此,我更愿意在设计器中使用原生 QIcon,欢迎任何想法或反馈。