【问题标题】:Qt C++ Custom QWidget with Templates带有模板的 Qt C++ 自定义 QWidget
【发布时间】: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_vecAbsDataAbstractData 组成,它将包含我想在屏幕上显示为元素的 QWidget(因为我将有一个列表,您可以在其中滚动元素)。而且 T 将是用户想要的任何数据。

有什么方法可以得到我想要的吗?因为到目前为止 QT 会向我发送错误消息:

错误:Q_OBJECT 不支持模板类

如何将模板和 QWidget 结合起来,以使我可以发出一个数据类型 T 可以是任何东西的信号?

我知道here 的答案,但我不能这样做,因为我不知道我的用户想要使用什么样的数据。有什么解决办法吗?

【问题讨论】:

  • 你可以看看 moc 生成的代码。 (AFAIK,这也是 C++ 代码。)也许,您可以找到一种手动编写它的方法,而不是依赖于 moc。因此也可以以某种方式使其模板化。恐怕没那么容易。仅供参考:当我最近研究编译时计数时,我偶然发现了Copperspice,它似乎是一个“Qt 克隆”,但没有 moc... ;-)
  • 你可以用多态类达到同样的效果。您的数据可以是哪些类型,即您的模板参数可以采用哪种类型?

标签: c++ qt templates qwidget qt-signals


【解决方案1】:

如何将模板和 QWidget 结合起来,以便发出数据类型为 T 的信号,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
};

【讨论】:

    猜你喜欢
    • 2011-06-23
    • 2021-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多