2

我想知道是否可以将 QPushButton 存储在 QVariant 中。更准确地说,我正在尝试在具有函数的 QStandardItemModel 中使用它setData。这就是我想要做的:

QPushButton* button = new QPushButton("Update");
setData(index(0, 0), "Button");
setData(index(0, 1), button);

但显然,它不是那样工作的,所以我尝试了这个:

QVariant variant;
variant.setValue(button);
setData(index(0, 1), QVariant::fromValue(variant));

它也不起作用。我想在不使用 QTableView 的情况下做到这一点(我知道这种视图中有一个 setIndexWidget)。

提前致谢!

4

2 回答 2

9

QVariant需要它可以存储的类型的元类型。Qt 提供了一组常用类型,但您可以简单地扩展它,使用Q_DECLARE_METATYPE宏:

#include <QPushButton>
#include <QVariant>

Q_DECLARE_METATYPE(QPushButton*)

void foo() {
    QPushButton *b1 = new QPushButton("button");
    QVariant v = QVariant::fromValue(b1);
    QPushButton *b2 = qvariant_cast<QPushButton*>(v);
}

注意:如果您还想在队列插槽连接或 with 中使用自定义元类型QMetaMethod,则必须调用qRegisterMetaType<QPushButton*>()

于 2016-01-29T11:01:51.420 回答
1

您可以执行以下操作,将其存储到QVariant

QVariant v = QVariant::fromValue((void *) button);

并从中检索它QVariant

new_button_pointer = (QPushButton *) v.value<void *>();

记得小心使用!处理这样的指针是非常不安全的

于 2016-01-29T10:53:44.933 回答