Probleme bei der konsistenten Positionierung von QListWidget-Elementen
Ich bin neu im Qt-Framework. In einer neuen Anwendung möchte ich eine Liste mit benutzerdefinierten Elementen erstellen. Diese Elemente sind recht einfach und müssen Titeletikett, Miniaturbild und Beschreibungsetikett enthalten ( Bild hier )
Im Moment möchte ich nicht mit benutzerdefiniertem Zeichnen und all dem Zeug spielen, weil ich denke, dass es einfacher ist, Elemente, die ich möchte, mit dem richtigen Widget/Layout zu erstellen, also habe ich mich entschieden, QListwidget zu verwenden und QAbstractItemModel (KeyframeModel) und QListWidgetItem (TileWidgetItem) zu unterordnen.
Nach einigem Codieren sieht es so aus, wie ich es wollte, aber QListWidget (Rastermodus) passiert etwas Seltsames, wenn ich einige Elemente hinzufüge. In meinem Fall ist ein QListWidget in der Größe veränderbar (da es in das Hauptlayout eingebettet ist) und die Anzahl der Spalten sollte von der Breite der Liste und der Elemente abhängen. Artikel haben eine feste Größe (zumindest vorerst). Aber wenn ich die Größe der Liste ändere, ist eines der Elemente in einer bestimmten Listenbreite falsch ausgerichtet, und ich weiß nicht, was los ist. Unten sind die Screenshots von der App:
Bild. 1 Anfangszustand auflisten (direkt nach dem Start)
Bild. 2 Liste nach Größenänderung Nr. 1
Bild. 3 Liste nach Größenänderung Nr. 2
Die Größenänderung Nr. 2 ist ein paar Pixel breiter als die Größenänderung Nr. 1 und die Größenänderung Nr. 1 ist schwer zu bekommen (Grenzfall) - ein paar Pixel weniger Breite und ich habe 2 Spalten (es ist okay), aber ein paar Pixel mehr und ich lande bei Fall #2. In allen Fällen ist die Anzahl der Spalten in Ordnung.
Manchmal ist auch das letzte Element nach dem Programmstart gleich wie hier falsch ausgerichtet (gleich nach dem Start wie in Bild 1, aber wie Sie trotz gleicher Listenbreite ein anderes Ergebnis sehen können). Ich frage mich, warum es nach dem Start so inkonsistent ist.
Verpasse ich etwas? Muss ich einige Teile anders machen? Oder sind es nur einige Störungen im Debug-Modus?
Unten poste ich einen Code:
Anwendung:
// Source file
QtGuiApplication1::QtGuiApplication1(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
//--------------------------------------------------------------------------------
// Add elements to the list
TileWidgetItem *item = new TileWidgetItem();
item->setData(TileWidgetItem::TileRole::TitleRole, QVariant("Long title"));
item->setData(TileWidgetItem::TileRole::DescriptionRole, QVariant("My long info"));
item->setText("My super text");
qDebug() << "Widget size hint: " << item->sizeHint();
ui.listWidget_moves->addItem(item);
item->updateView();
TileWidgetItem *item1 = new TileWidgetItem();
item1->setData(TileWidgetItem::TileRole::TitleRole, QVariant("Item #2"));
item1->setText("Tile #2");
ui.listWidget_moves->addItem(item1);
item1->updateView();
TileWidgetItem *item2 = new TileWidgetItem();
ui.listWidget_moves->addItem(item2);
item2->updateView();
TileWidgetItem *item3 = new TileWidgetItem();
ui.listWidget_moves->addItem(item3);
item3->updateView();
//--------------------------------------------------------------------------------
// Adjust cell size
QSize cellSize;
for (uint i = 0; i < ui.listWidget_moves->count(); i++)
{
int dim = ui.listWidget_moves->item(i)->sizeHint().height();
if (dim > cellSize.height())
cellSize.setHeight(dim);
dim = ui.listWidget_moves->item(i)->sizeHint().width();
if (dim > cellSize.width())
cellSize.setWidth(dim);
}
ui.listWidget_moves->setGridSize(cellSize);
}
Element-Widget:
// Source file
constexpr int MAX_THUMB_SIZE = 100;
TileWidgetItem::TileWidgetItem(QListWidget *listview)
: QListWidgetItem(listview, ItemType::UserType)
{
/* Prepare main widget */
QWidget *view = new QWidget();
view->setObjectName("tile");
view->setStyleSheet(
"QWidget#tile { margin: 4 8; background-color: #404040; border: 1 solid rgba(0,0,0,30%); border-radius: 4px }\n"
"QWidget#tile::hover { border: 1 solid #EEE; background-color: #484848 }\n"
"QWidget#tile[selected=true] { background-color: #00F }"
);
//-----------------------------------------------------------
/* Prepare layout */
QVBoxLayout *layout = new QVBoxLayout();
layout->setSizeConstraint(QLayout::SizeConstraint::SetFixedSize);
//-----------------------------------------------------------
/* Prepare title with icon */
QHBoxLayout *titleLayout = new QHBoxLayout();
QLabel *titleIcon = new QLabel();
titleIcon->setObjectName("titleIcon");
titleIcon->setStyleSheet("background-color: black");
titleIcon->setFixedSize(QSize(16, 16));
titleLayout->addWidget(titleIcon);
QLabel *title = new QLabel("Title");
title->setObjectName("title");
title->setMinimumWidth(60);
title->setStyleSheet("background-color: #800;");
titleLayout->addWidget(title);
QWidget *titleWidget = new QWidget();
titleWidget->setStyleSheet("background-color: #080");
titleWidget->setLayout(titleLayout);
layout->addWidget(titleWidget);
//-----------------------------------------------------------
/* Prepare thumbnail */
QLabel *thumbnail = new QLabel();
thumbnail->setObjectName("thumbnail");
thumbnail->setStyleSheet("background-color: black; border: 1 solid #F00");
thumbnail->setFixedSize(QSize(MAX_THUMB_SIZE, MAX_THUMB_SIZE * 0.7f));
thumbnail->setPixmap(QPixmap("Resources/moto.jpg").scaledToWidth(MAX_THUMB_SIZE));
layout->addWidget(thumbnail);
//-----------------------------------------------------------
/* Preparing additional info */
QLabel *description = new QLabel("Description");
description->setObjectName("description");
//description->setToolTip("Custom info tip");
description->setContentsMargins(4, 2, 4, 2);
layout->addWidget(description);
//-----------------------------------------------------------
view->setLayout(layout);
_customView = view;
_titleView = title;
_descriptionView = description;
setSizeHint(_customView->sizeHint());
updateView();
}
TileWidgetItem::~TileWidgetItem()
{
}
void TileWidgetItem::setData(int role, const QVariant &value)
{
QListWidgetItem::setData(role, value);
if (value.type() == QVariant::Type::String)
{
if (role == TileRole::TitleRole)
{
this->_titleView->setText(value.toString());
}
else if (role == TileRole::DescriptionRole)
{
this->_descriptionView->setText(value.toString());
}
setSizeHint(_customView->sizeHint());
}
}
void TileWidgetItem::updateView()
{
if (listWidget() != nullptr)
{
listWidget()->setItemWidget(this, this->_customView);
}
}
// Header file
class TileWidgetItem : public QListWidgetItem
{
public:
enum TileRole
{
TitleRole = Qt::UserRole + 1,
DescriptionRole,
ThumbnailRole
};
public:
TileWidgetItem(QListWidget *listview = nullptr);
~TileWidgetItem();
void setData(int role, const QVariant &value) override;
void updateView();
QWidget *customView() const { return _customView; };
QString getTitle() const { return _titleView->text(); };
QString getInfo() const { return _descriptionView->text(); };
private:
QWidget *_customView;
QLabel *_titleView;
QLabel *_descriptionView;
};
Plattform: Windows 10
Qt-Version: 5.14.2
IDE: Visual Studio 2019 (mit Qt VS Tools)
Antworten
Am Ende habe ich nur benutzerdefinierte Delegaten verwendet, die Probleme gelöst haben.
Ich wollte das System überbeanspruchen und wurde besiegt :)