是否可以将 QPushButton 存储在 QVariant 中?

Is it possible to store a QPushButton in a QVariant?

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

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)。

提前致谢!

您可以这样做,将其存储到 QVariant:

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

并从 QVariant 检索它:

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

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

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);
}

注意:如果您还想在排队槽连接中或与 QMetaMethod 一起使用您的自定义元类型,您必须调用 qRegisterMetaType<QPushButton*>()