【发布时间】:2021-02-17 07:27:31
【问题描述】:
我正在尝试组合一个 Custom QWidget,它应该包含一些 Template 参数内幕,但我不知道该怎么做,因为我不被允许由 Qt.
我的模板类:
template<typename T>
struct AbstractData {
QWidget* displayedItem{};
T* data;
};
现在我要做的是创建一个自定义小部件,如 QScrollArea(类似,不一样)。 但是当有人点击一个元素时,我想发出一个包含用户提供的数据结构的信号。
例如:
template<typename T>
class PlaylistController : public QWidget {
Q_OBJECT
private:
QLayout *m_layout{};
std::vector<AbstractData<T> *> m_vecAbsData{};
std::vector<DelegateItem *> m_items{};
public:
explicit PlaylistController(QWidget *parent = nullptr);
protected:
void paintEvent(QPaintEvent *event) override;
void wheelEvent(QWheelEvent *event) override;
signals:
void clicked(T elem);
public slots:
void loadElements(const std::vector<AbstractData<T> *> &elements);
};
这里的 m_vecAbsData 由 AbstractData 组成,它将包含我想在屏幕上显示为元素的 QWidget(因为我将有一个列表,您可以在其中滚动元素)。而且 T 将是用户想要的任何数据。
有什么方法可以得到我想要的吗?因为到目前为止 QT 会向我发送错误消息:
错误:Q_OBJECT 不支持模板类
如何将模板和 QWidget 结合起来,以使我可以发出一个数据类型 T 可以是任何东西的信号?
我知道here 的答案,但我不能这样做,因为我不知道我的用户想要使用什么样的数据。有什么解决办法吗?
【问题讨论】:
-
你可以看看 moc 生成的代码。 (AFAIK,这也是 C++ 代码。)也许,您可以找到一种手动编写它的方法,而不是依赖于 moc。因此也可以以某种方式使其模板化。恐怕没那么容易。仅供参考:当我最近研究编译时计数时,我偶然发现了Copperspice,它似乎是一个“Qt 克隆”,但没有 moc... ;-)
-
你可以用多态类达到同样的效果。您的数据可以是哪些类型,即您的模板参数可以采用哪种类型?
标签: c++ qt templates qwidget qt-signals