2016-01-29 11 views
2

Я хотел бы знать, можно ли хранить QPushButton в QVariant. Точнее, я пытаюсь использовать его в QStandardItemModel с функцией setData. Вот что я хочу сделать:Возможно ли хранить QPushButton в QVariant?

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

Зачем вам нужно указывать указатель на кнопку в вашей модели? – vahancho

ответ

7

QVariant нужен метатип для типов, которые он может хранить. Qt предоставляет набор наиболее часто используемых типов, но вы можете просто расширить его, используя Q_DECLARE_METATYPE Macro:

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

+0

Удивительно! Очень хорошая точка! – Tarod

+0

Большое спасибо за это! У вас есть идея, как я могу отобразить свою кнопку после этого? 'SetData 'позволяет мне отображать QString и QIcon, но я не могу получить свою кнопку таким же образом. – IAmInPLS

+0

Это зависит от того, какой вид вы используете, и какую роль вы используете для установки данных (в вашем коде используется' Qt :: EditRole'). Я не думаю, что при условии, что Qt будет рассматривать Qt, будет обрабатывать QPushButton. ... посмотрите руководство Qt Model/View: http://doc.qt.io/qt-5/model-view- programming.html –

0

Вы можете сделать что-то вроде этого, чтобы сохранить его в QVariant:

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

и извлечь его из QVariant:

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

Не забывайте использовать его с осторожностью! Очень опасно обращаться с указателями вроде этого

+0

Хорошо для хранения, но как я могу отобразить свою кнопку после этого? Потому что setData принимает параметр «variant» в параметре, но я хотел бы иметь свою кнопку :( – IAmInPLS