Qt C ++自定义QWidget与模板

问题描述

我正在尝试组合一个自定义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会向我发送错误消息:

错误:Q_OBJECT不支持模板类

如何将模板和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
};