如何在 QListWidget 中缩放自定义小部件?

Posted

技术标签:

【中文标题】如何在 QListWidget 中缩放自定义小部件?【英文标题】:How to scale a custom widget within a QListWidget? 【发布时间】:2018-01-07 15:25:28 【问题描述】:

我创建了一个自定义小部件,其中包括带有 qlabel(包含图标)和 qcombobox 的垂直布局 我将它们用作列表小部件。 它们是基于具有 100 个图标的文件创建的。 我正在尝试创建一个在应用程序实时运行时缩放像素图大小的滑块。 我不知道如何正确编码,所以我可以访问这个属性。 这是mainwindow.cpp中的代码

/*load icons*/
QDir dir (....);
QFileInfoList list = dir.entryInfoList(QDir::AllEntries | 
QDir::Dirs|QDir::NoDotAndDotDot);

for(int i=0 ; i < list.length() ; i++)

QIcon icon;
icon.addFile(list.at(i).absoluteFilePath(), QSize(), QIcon::Normal, 
            QIcon::Off);
mypix = icon.pixmap(QSize(128,128));

/*Custom Widget*/
widget.push_back(new QWidget(ui->listWidget));
widget[i]->setMinimumSize(QSize(0, 150));

/*the VB with of label-combo*/
layout.push_back(new QVBoxLayout(widget[i]));

/*Qlabel that holds the icon*/
pic.push_back(new QLabel (widget[i]));
pic[i]->setPixmap(mypix);
layout[i]->addWidget(pic[i]);
box.push_back(new QComboBox(widget[i]));
box[i]->addItem(list.at(i).baseName());
layout[i]->addWidget(box[i]);

QListWidgetItem * qlistwidgetitem = new QListWidgetItem;
ui->listWidget->addItem(qlistwidgetitem);
ui->listWidget->setItemWidget(ui->listWidget->item(i),widget[i]);
  

【问题讨论】:

什么是 push_back? 【参考方案1】:

QListWidgetItem有一个默认大小,没有考虑到widget的大小,解决方法是将widget的sizeHint()传递给QListWidgetItem,同样不能将高度设置为0小部件,只有最小宽度。

QDir dir (...);
const QFileInfoList &infolist = dir.entryInfoList(QDir::AllEntries| QDir::Dirs| QDir::NoDotAndDotDot);
for(const QFileInfo &info: infolist)
    QIcon icon;
    icon.addFile(info.absoluteFilePath(), QSize(), QIcon::Normal, QIcon::Off);
    QPixmap pix = icon.pixmap(QSize(128,128));
    QWidget *w = new QWidget(ui->listWidget);
    w->setMinimumWidth(150);
    QVBoxLayout *lay = new QVBoxLayout(w);
    QLabel *lbl = new QLabel(w);
    lbl->setPixmap(pix);
    QComboBox *combo = new QComboBox(w);
    combo->addItem(info.baseName());

    lay->addWidget(lbl);
    lay->addWidget(combo);

    widget << w;
    layout << lay;
    box << combo;
    pic << lbl;

    QListWidgetItem *qlistwidgetitem = new QListWidgetItem;
    qlistwidgetitem->setSizeHint(w->sizeHint());
    ui->listWidget->addItem(qlistwidgetitem);
    ui->listWidget->setItemWidget(qlistwidgetitem, w);


更新:

如果您想使用QSlider 更改图标的大小,建议保存图标以便我们可以使用setData() 方法,然后我们将一个插槽与滑块关联,并在该插槽中插入一个图标的新大小并将其设置为QLabel

for(const QFileInfo &info: infolist)
    [...]
    qlistwidgetitem->setData(Qt::UserRole, QVariant::fromValue(icon));
    [...]


void Widget::on_horizontalSlider_valueChanged(int value)

    for(int i=0; i< ui->listWidget->count(); i++)
        QListWidgetItem *it = ui->listWidget->item(i);
        QIcon icon = it->data(Qt::UserRole).value<QIcon>();
        pic[i]->setPixmap(icon.pixmap(value, value));
        QWidget *w = ui->listWidget->itemWidget(it);
        it->setSizeHint(w->sizeHint());
    

完整的例子可以在下面的link找到。

【讨论】:

好的,谢谢你的代码,它比我的要好得多。但是知道我想访问图标的大小,就像我使用 qlistwidgetitem-&gt;setIcon(icon);void MainWindow::on_verticalScrollBar_valueChanged(int value) ui-&gt;listWidget-&gt;setIconSize(QSize(value,value)); 这样的滚动条一样 我不知道如何使用滚动条访问 qlabel 内的图标大小 是的,但在应用运行时使用滚动条实时设置 我的意思是用滚动条调整所有图标的大小

以上是关于如何在 QListWidget 中缩放自定义小部件?的主要内容,如果未能解决你的问题,请参考以下文章

在 QListWidget 之间拖放自定义小部件项目

使 QListWidget 调整其项目的大小以填充空间

QListWidget 拖放与通过 setItemWidget 设置的自定义小部件

将自定义 QWidget 添加到 QListWidget

QWidget如何在子小部件中接收keyPressEvent

如何使 QListWidgetItem 根据其内容自动调整大小,并适合其 QListWidget