gpt4 book ai didi

c++ - QListWidget 项目一致定位问题

转载 作者:行者123 更新时间:2023-12-02 10:28:00 25 4
gpt4 key购买 nike

我是 Qt 框架的新手。在新应用程序中,我想创建包含自定义项目的列表。这些项目非常简单,必须包含标题标签、缩略图和描述标签 (picture here)
现在我不想玩自定义绘图和所有这些东西,因为我认为使用适当的小部件/布局更容易完成我想要的项目,所以我决定使用 QListwidget 和子类 QAbstractItemModel (KeyframeModel) 和 QListWidgetItem (TileWidgetItem)。
经过一些编码后,它看起来是我想要的,但是当我添加一些项目时,QListWidget(网格模式)发生了奇怪的事情。在我的情况下,QListWidget 是可调整大小的(由于它是如何嵌入到主布局中的),并且列数应该取决于列表和项目的宽度。项目是固定大小的(至少现在是这样)。
但是当我调整列表的大小时,某个列表宽度的项目之一是未对齐的,而不是我不知道发生了什么。以下是来自应用程序的屏幕截图:
Pic. 1 List initial state (right after start)
Pic. 2 List after resizing #1
Pic. 3 List after resizing #2
调整 #2 的大小比调整 #1 宽几个像素,调整 #1 的大小很难获得(边界情况) - 宽度少了几个像素,我有 2 列(没关系),但多了一些像素,我最终得到了案例#2。
在所有情况下,列数都可以。
有时在程序立即启动后最后一项也未对齐,如 here (就像在图 1 中一样开始之后,但尽管列表宽度相同,但您可以看到不同的结果)。
我想知道为什么启动后它会如此不一致。
我错过了什么吗?我必须以不同的方式做一些部分吗?
还是只是 Debug模式下的一些小故障?
下面我贴一些代码:
申请:

// 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;
};
平台:Windows 10
Qt版本:5.14.2
IDE:Visual Studio 2019(带有 Qt VS 工具)

最佳答案

最后,我只是使用了解决问题的自定义委托(delegate)。
我想过度使用系统,但我被打败了:)

关于c++ - QListWidget 项目一致定位问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63451153/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com