QListWidget आइटम लगातार स्थिति की समस्या है
मैं क्यूटी ढांचे में नया हूं। नए एप्लिकेशन में मैं अनुकूलित वस्तुओं के साथ सूची बनाना चाहता हूं। ये आइटम काफी सरल हैं और इसमें शीर्षक लेबल, थंबनेल और विवरण लेबल ( चित्र यहां ) होना चाहिए
अभी के लिए मैं कस्टम ड्राइंग और सभी सामानों के साथ नहीं खेलना चाहता हूं क्योंकि मुझे लगता है कि यह उन आइटमों को करना आसान है जिन्हें मैं उचित विजेट / लेआउट के साथ चाहता हूं इसलिए मैंने QListwidget और QAbstractItemModel (KeyframeModel) और QListWidgetItem (TileWidgetItem) का उपयोग करने का निर्णय लिया।
कुछ कोडिंग के बाद ऐसा लगता है कि मैं कैसे चाहता था लेकिन जब मैं कुछ आइटम जोड़ता हूं तो अजीब बात QListWidget (ग्रिड मोड) में होती है। मेरे मामले में एक QListWidget resizable है (कैसे यह मुख्य लेआउट के अंदर एम्बेडेड है) और स्तंभों की संख्या सूची और आइटम की चौड़ाई पर निर्भर होनी चाहिए। आइटम निश्चित आकार (कम से कम अभी के लिए) हैं। लेकिन जब मैं सूची का आकार बदलता हूं तो कुछ सूची की चौड़ाई में से किसी एक वस्तु का दुरुपयोग होता है और मुझे नहीं पता कि क्या चल रहा है। नीचे एप्लिकेशन से ते स्क्रीनशॉट हैं:
तस्वीर। 1 सूची प्रारंभिक अवस्था (शुरुआत के ठीक बाद)
तस्वीर। # 1 के आकार के बाद 2 सूची
तस्वीर। # 2 के आकार के बाद 3 सूची
# 2 का आकार बदलना # 1 के आकार की तुलना में कुछ पिक्सेल चौड़ा है और # 1 का आकार बदलना मुश्किल है (बॉर्डर केस) - कुछ पिक्सेल की चौड़ाई कम है और मुझे 2 कॉलम मिले हैं (यह ठीक है) लेकिन कुछ पिक्सल अधिक हैं और मैं केस के साथ समाप्त होता हूं # २। सभी मामलों में स्तंभों की संख्या ठीक है।
के बाद कार्यक्रम शुरू सही दूर की तरह कभी कभी भी अंतिम आइटम गलत संरेखित है यहाँ (सही होने के बाद पिक में की तरह लगते हैं। 1 लेकिन जैसा कि आप एक ही सूची चौड़ाई के बावजूद अलग परिणाम देख सकते हैं)। मुझे आश्चर्य है कि स्टार्ट-अप के बाद यह इतना असंगत क्यों है।
क्या मुझे कुछ याद आ रहा है? क्या मुझे कुछ हिस्सों को अलग-अलग तरीके से करना चाहिए? या यह डिबग मोड में सिर्फ कुछ गड़बड़ है?
नीचे मैं कुछ कोड पोस्ट करता हूं:
आवेदन:
// 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);
}
आइटम विजेट:
// 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;
};
प्लेटफार्म: विंडोज १०
क्यूटी संस्करण: ५.१४.२
आईडीई: विजुअल स्टूडियो २०१ ९ (क्यूटी वीएस टूल्स के साथ)
जवाब
अंत में मैंने सिर्फ कस्टम प्रतिनिधियों का इस्तेमाल किया, जिन्होंने समस्याओं को हल किया।
मैं प्रणाली का उपयोग करना चाहता था और मैं हार गया था :)