Не могу найти у QTreeWidgetItem свойство типа void* для связывания с произвольным экземпляром данных.
В других библиотеках, как правило, есть подобное свойство у класса Узла дерева.
Неужели единственный выход это наследование и созднание собственного класса?
Если я не ошибаюсь, то для этих целей используется:
void QTreeWidgetItem::setData ( int column, int role, const QVariant & value ) [virtual]
QVariant QTreeWidgetItem::data ( int column, int role ) const [virtual]
Это если типы совместимы с Variant, чаще всего, строчные или численные данные.
Мне же нужно связать с узлом дерева экземпляр класса QGraphicsPixmapItem из сцены.
В графической сцене элементы хранятся в списке, а мне нужно отобразить список на древесную структуру и на виджет.
Для этого и нужен void*
При выборе элемента дерева, вызвать метод контейнера, содержащего элемент(в данном случае MyQGraphicsScene),
передать в него указатель, там выполнить приведение типа и выделить пунктиром на сцене, соответсвующее изображение.
Пример того, как обращаться в QVariant спользовательским типом:
#include <QtCore/QCoreApplication>
#include <QString>
#include <QStringList>
#include <QVariant>
struct MyStruct
{
QStringList m_listData;
};
Q_DECLARE_METATYPE(MyStruct)
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
MyStruct ms;
for( int n = 0; n < 10; n++)
{
QString sz;
sz.sprintf( "test string %d", n);
ms.m_listData.append( sz);
}
QVariant v;
v.setValue( ms);
MyStruct newms;
if( v.canConvert<MyStruct>())
{
newms = v.value<MyStruct>();
qDebug( "List strings");
QStringList::iterator pIter;
for( pIter = newms.m_listData.begin(); pIter != newms.m_listData.end(); pIter++)
{
qDebug( "\t%s", qPrintable( *pIter));
}
}
return a.exec();
}
Можно, если я правильно тебя понял, вот пример:
#include <QtCore/QCoreApplication>
#include <QString>
#include <QStringList>
#include <QVariant>
struct MyStruct
{
QStringList m_listData;
};
Q_DECLARE_METATYPE(MyStruct*)
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
MyStruct *pms = new MyStruct;
for( int n = 0; n < 10; n++)
{
QString sz;
sz.sprintf( "test string %d", n);
pms->m_listData.append( sz);
}
QVariant v;
v.setValue( pms);
MyStruct *pnewms;
if( v.canConvert<MyStruct*>())
{
pnewms = v.value<MyStruct*>();
qDebug( "List strings");
QStringList::iterator pIter;
for( pIter = pnewms->m_listData.begin(); pIter != pnewms->m_listData.end(); pIter++)
{
qDebug( "\t%s", qPrintable( *pIter));
}
}
return a.exec();
}
void* можно без проблем хранить в QVariant. Он уже объявлен в Qt как поддерживаемый тип. Работать с ним так же как и с другими типами например из QtGui.
Всем спасибо за примеры и инфу. Буду дальше копать.
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)