Render QWidget in der paint () - Methode der QWidgetDelegate für eine QListView
ich habe Schwierigkeiten bei der Umsetzung von custom-widget-Darstellung in einer QListView
.
Ich habe derzeit eine QListView
anzeigen meine custom-Modell namens PlayQueue
basierend auf QAbstractListModel
.
Dies ist in Ordnung arbeiten mit einfachen text, aber jetzt würde ich mag, um die Anzeige einer benutzerdefinierten widget für jedes element.
Also habe ich eine Unterklasse QStyledItemDelegate
zur Umsetzung der paint
Methode wie diese:
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);
}
Die Auswahl der hintergrund ist richtig gerendert, aber kein widget angezeigt wird. Ich habe versucht, mit einfachen QPainter
Befehle wie in der Qt-Beispiele, und dies gut funktioniert:
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");
}
Also habe ich versucht einige änderungen wie:
- Ändern
QStyledItemDelegate
zuQItemDelegate
- Hinzufügen
painter->save()
undpainter->restore()
um rendering - Einstellung der widget-geometrie, die Größe
Aber ich bin ein bisschen stecken, nun, ich suchte eine Weile im internet, aber nicht finden können, jedes Beispiel, das tun, was ich will, Sie alle sprechen über das Bearbeiten-widget (das ist viel einfacher) oder custom-drawn control (vorgefertigte, wie progress bars).
Aber hier brauche ich wirklich ein custom-widget die ich erstellt habe, mit einigen layout, Etiketten & pixmaps.
Vielen Dank für Ihre Hilfe!
Verwende ich Qt 4.7.3 für GCC auf Ubuntu 11.04.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nur um das ganze abzuschließen Bild: weiter findet man den code zu verwalten, die QWidget als QListView Element mithilfe der Delegierten.
Habe ich endlich herausgefunden, wie es funktioniert innerhalb der Unterklasse der QStyledItemDelegate mit der paint (...) - Methode.
Scheint es effektiver für die Leistung als die Vorherige Lösung, aber diese Aussage, die man überprüfen muss =) durch die Untersuchung, was bedeutet setIndexWidget() machen mit erstellt QWidget.
So endlich, hier ist der code:
.....
.....
painter->end();
ich erstelltQPoint mappedorigin = painter->deviceTransform().map(QPoint(option.rect.x(), option.rect.y()))
, dann an mappedorigin als 2. arg für QWidget::render(). Dies wäre wahrscheinlich nicht notwendig sein, wenn ich erstellt hatte, das widget in dieser Funktion, aber ich habe es als Teil des Eltern-widget.Ok, ich endlich herausgefunden, wie das zu tun, was ich wollte. Hier ist was ich getan habe:
QListView::setIndexWidget()
imdata()
Methode von meinem Modell um die widget -QListView::indexWidget()
Qt::SizeHintRole
Rolle zurückzukehren, die widget-Größe HinweisQt::DisplayRole
RolleDiese Weise habe ich meine eigene widgets angezeigt, die in der QListView, und Sie sind richtig faul geladen (das ist, warum ich verwendet die model/view-pattern). Aber ich sehe nicht, wie kann ich diese entfernen, wenn Sie nicht immer angezeigt, naja das ist ein anderes problem.
Hier ist ein Beispiel für Sie.
Es scheint, dass Sie verwenden müssen QStylePainter aber das ist nur für die Zeichnung soweit ich das verstanden habe, agiert er nicht wie ein richtiger button.