问题描述
我正在尝试组合一个自定义QWidget ,其中应该包含一些 Template 参数内幕,但是我不知道该怎么做,因为我不允许通过Qt。
我的模板类别:
template<typename T>
struct AbstractData {
QWidget* displayeditem{};
T* data;
};
现在我要做的是创建一个自定义Widget,例如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会向我发送错误消息:
如何将模板和QWidget组合在一起,以使我可以发射具有数据类型T的信号?
我知道来自here的答案,但是我无法做到这一点,因为我不知道用户想要使用哪种数据。有什么解决方法吗?
解决方法
如何组合模板和QWidget,使我可以发出信号类型为T的信号?
不能。 Moc需要一个完全定义的类型。 here有一个很好的解释。
您可以让模板类从QObject派生,只要它们不使用模板中的信号或插槽即可。看起来像这样:
class SomeBase : public QObject
{
Q_OBJECT
...
signals:
void someSignal();
};
template<class T>
class SomeTemplate : SomeBase
{
// Don't use Q_OBJECT macro
// Don't use signals or slots
};