View source
From TaskDepender
for
Qt - use QListWidgetItem user data
Jump to:
navigation
,
search
''This page describes how the user data of a QListWidgetItem can be used to store a custom class.'' == Introduction == The <tt>QListWidgetItem</tt><ref>[http://developer.qt.nokia.com/doc/qt-4.8/qlistwidgetitem.html QListWidget Class Reference - Qt 4.8]</ref> has an attribute: <syntaxhighlight lang="cpp-qt"> QVariant QListWidgetItem data(int role) </syntaxhighlight> This can be used to store a custom class. How this is done is described on this page. == Custom class definition == Suppose a custom class is defined as follows: <syntaxhighlight lang="cpp-qt"> class MyCustomClass { public: MyCustomClass(); ~MyCustomClass(); int a; }; </syntaxhighlight> To ensure that the class is compatible with QVariant, the following is added<ref>[http://developer.qt.nokia.com/doc/qt-4.8//qmetatype.html QMetaType Class Reference - Qt 4.8 reference]</ref>: <syntaxhighlight lang="cpp-qt"> #include <QMetaType> Q_DECLARE_METATYPE(MyCustomClass) </syntaxhighlight> == GUI == A main window with a list and two line edit fields and a push-button. == Adding the QListWidget == Suppose one edit fields hold the value for <tt>a</tt> and the other the text associated with the list widget item. If a button is clicked, a new <tt>QListWidgetItem</tt> must be added with the text retrieve from one of the line edits and an instance of the <tt>MyCustomClass</tt> must be attached with the <tt>a</tt> attribute set by the integer conversion of the other line edit field. When clicked on an item in the list, the date of the item clicked must be received and put in the corresponding line edit fields. == Implementation == TODO: create actual small application. === Add item === <syntaxhighlight lang="cpp-qt"> void MainWindow::addItem() { // Local temporary variables. MyCustomClass myClass; QVariant qv; myClass.a = ui->valueLineEdit->text().toInt(); // Use content of local variable and copy. qv.setValue(myClass); QListWidgetItem *qlwi = new QListWidgetItem(); qlwi->setText(ui->textLineEdit->text()); // Copy the local qvariant and store with list item. qlwi->setData(Qt::UserRole,qv); ui->listWidget->addItem(qlwi); } </syntaxhighlight> === Display data === <syntaxhighlight lang="cpp-qt"> void MainWindow::displayData(QListWidgetItem *item) { textLineEdit->setText(item->text()); MyCustomClass myClass = item->data(Qt::UserRole).value<MyCustomClass>(); ui->lineEdit->setText(QString("%1").arg(myClass.a)); } </syntaxhighlight> === Change data === <syntaxhighlight lang="cpp-qt"> void MainWindow::changeData(QListWidgetItem *item) { QVariant *qvPtr = item->data(Qt::UserRole); MyCustomClass myClass = qvPtr->value<MyCustomClass>(); myClass.a += 1; qvPtr->setValue(myClass); } </syntaxhighlight> == References == <references/>
Return to
Qt - use QListWidgetItem user data
.
Views
Page
Discussion
View source
History
Personal tools
Log in
Navigation
Main page
Recent changes
Help
Search
Toolbox
What links here
Related changes
Special pages