saya mengalami kesulitan dalam mengimplementasikan rendering widget khusus di QListView
. Saat ini saya memiliki QListView
yang menampilkan model khusus saya yang disebut PlayQueue
berdasarkan QAbstractListModel
.
Ini berfungsi baik dengan teks sederhana, tapi sekarang saya ingin menampilkan widget khusus untuk setiap elemen. Jadi saya membuat subkelas QStyledItemDelegate
untuk mengimplementasikan metode paint
seperti ini:
void QueueableDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index ) const
{
if (option.state & QStyle::State_Selected)
painter->fillRect(option.rect, option.palette.highlight());
QWidget *widget = new QPushButton("bonjour");
widget->render(painter);
}
Latar belakang pemilihan ditampilkan dengan benar tetapi tidak ada widget yang ditampilkan. Saya mencoba dengan perintah QPainter
sederhana seperti pada contoh Qt, dan ini berfungsi dengan baik:
void QueueableDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index ) const
{
if (option.state & QStyle::State_Selected)
painter->fillRect(option.rect, option.palette.highlight());
if (option.state & QStyle::State_Selected)
painter->setPen(option.palette.highlightedText().color());
painter->setFont(QFont("Arial", 10));
painter->drawText(option.rect, Qt::AlignCenter, "Custom drawing");
}
Jadi saya mencoba beberapa perubahan seperti:
- Mengubah
QStyledItemDelegate
menjadiQItemDelegate
- Menambahkan
painter->save()
danpainter->restore()
di sekitar rendering - Mengatur geometri widget ke ukuran yang tersedia
Tapi saya agak buntu sekarang, saya mencari sebentar di internet, tetapi tidak menemukan contoh melakukan apa yang saya inginkan, semuanya berbicara tentang mengedit widget (yang jauh lebih mudah) atau kontrol yang digambar khusus (yang sudah ditentukan sebelumnya) , seperti bilah kemajuan). Tapi disini saya sangat membutuhkan custom widget yang saya buat, berisi beberapa layout, label & pixmaps. Terima kasih atas bantuan Anda!
Saya menggunakan Qt 4.7.3 untuk GCC di Ubuntu 11.04.