在 Qt Creator Designer 中用自定义模板小部件替换小部件

Posted

技术标签:

【中文标题】在 Qt Creator Designer 中用自定义模板小部件替换小部件【英文标题】:Replacing widget with custom template widget in Qt Creator Designer 【发布时间】:2016-02-27 16:12:15 【问题描述】:

在 Qt Creator UI Designer 中,可以将小部件替换为其子类。我创建了QComboBox 的模板子类:

template <typename T>
class MappedComboBox : public QComboBox

    // ...
;

我已经成功地将QComboBox 替换为MappedComboBox&lt;int&gt;。然而,用 MappedComboBox&lt;QSerialPort::BaudRate&gt; 替换 QComboBox 小部件会失败,因为在构建时会出现依赖错误

'QSerialPort' 未在此范围内声明。

当然,摆脱它们的一种方法是将QSerialPort 包含在mappedcombobox.h 中,但这不是一种非常优雅的方式。我能以某种方式告诉 Qt Designer 在生成 UI 时包含其他文件吗?

【问题讨论】:

尝试在 Qt Designer 中的升级对话框中选中“全局”复选框。并在标题行编辑中写入 qserialport.h。 @Radek 好主意,但似乎不起作用。 Qt moc 不支持所有耗尽问题的模板类。尝试继承您的小部件以获得确切的类型:MappedIntComboBox : public MappedComboBox&lt; int &gt;; @SaZ 嘿,我意识到 QT MOC 不支持带有信号和插槽的模板类,但在这里不是问题。一切正常,只是它不包含ui_mainwindow.h 中所需的文件,我需要做一些非常丑陋的解决方法。 【参考方案1】:

在 UI 设计器中,无法包含额外的标题。更好的解决方法是在包含生成的标头之前将其包含在设计器类的 cpp 文件中。这比包含在与该标题无关的 MappedComboBox 中要好。

在 mainwindow.cpp 中:

#include "mainwindow.h"
#include <QSerialPort>
#include "ui_mainwindow.h"

【讨论】:

以上是关于在 Qt Creator Designer 中用自定义模板小部件替换小部件的主要内容,如果未能解决你的问题,请参考以下文章

在qt creator中用ui设计器创建了一个QDialog的窗口,添加了一个QWidget部件,怎么能在Qwidget上用QPainter

如何在 Qt Creator 中用行号减小列的宽度?

qt 关于使用qt designer创建的控件和代码中添加的控件有啥区别??

是否可以在 Qt Designer 中使用来自 Qt Designer 的 .ui 文件作为自定义小部件?

Qt Creator中,代码中用到一个宏定义,如何跳到该宏的定义的地方呢?

如何在 Qt-Designer 中使用自定义小部件