Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt C++;带有模板的自定义QWidget_C++_Qt_Templates_Qwidget_Qt Signals - Fatal编程技术网

C++ Qt C++;带有模板的自定义QWidget

C++ Qt C++;带有模板的自定义QWidget,c++,qt,templates,qwidget,qt-signals,C++,Qt,Templates,Qwidget,Qt Signals,我正在尝试组合一个自定义QWidget,它应该包含一些模板内部参数,但我不知道如何做,因为Qt不允许我这样做 我的模板类: template<typename T> struct AbstractData { QWidget* displayedItem{}; T* data; }; 模板 结构抽象数据{ QWidget*displayedItem{}; T*数据; }; 现在我要做的是创建一个定制的小部件,比如QScrollArea(类似,不同)。 但是当有人点

我正在尝试组合一个自定义QWidget,它应该包含一些模板内部参数,但我不知道如何做,因为Qt不允许我这样做

我的模板类:

template<typename T>
struct AbstractData {
    QWidget* displayedItem{};
    T* data;
};
模板
结构抽象数据{
QWidget*displayedItem{};
T*数据;
};
现在我要做的是创建一个定制的小部件,比如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);
};
模板
类控制器:公共QWidget{
Q_对象
私人:
QLayout*m_布局{};
但是我不能这样做,因为我不知道我的用户想要使用什么样的数据。有什么解决方法吗

我如何将模板和QWidget结合在一起,从而发出一个数据类型为T的信号,它可以是任何东西

你不能。主运行中心需要一个完全定义的类型。有一个很好的解释

只要不使用模板中的信号或插槽,就可以让模板类从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
};
class SomeBase:公共QObject
{
Q_对象
...
信号:
无效信号();
};
模板
类SomeTemplate:SomeBase
{
//不要使用Q_对象宏
//不要使用信号或插槽
};

你可以查看一下MOC生成的代码(AFAIK,这也是C++代码)。也许,你会找到一种方法来手动编写它,而不是依赖于moc。因此,你也可以以某种方式将它模板化。可能没那么容易。仅供参考:最近我在研究编译时计数时,无意中发现了一个“Qt克隆”但是如果没有moc…;-)您可能会使用多态类实现相同的效果。您的数据可以是哪种类型,即您的模板参数可以采用哪种类型?