是否可以在QVariant中存储QPushButton?

时间:2016-01-29 10:47:51

标签: qt qpushbutton qvariant

我想知道是否可以在QVariant中存储QPushButton。更确切地说,我试图在具有函数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)。

提前致谢!

2 个答案:

答案 0 :(得分:8)

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*>()

答案 1 :(得分:1)

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

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

并从QVariant检索它:

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

请务必小心使用!处理像这样的指针是非常不安全的