我创建了一个自定义窗口小部件,其中包括带有qlabel(带有图标)和qcombobox的垂直布局
我将它们用作listwidget项目。
它们是基于具有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]);
}
}
最佳答案
QListWidgetItem
的默认大小不考虑窗口小部件的大小,解决方案是将窗口小部件的sizeHint()
传递给QListWidgetItem
,也不得将窗口小部件的高度设置为0,而应将最小宽度设置为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中找到。