Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在QListWidget中缩放自定义小部件?_C++_Qt_Qt5_Qwidget_Qlistwidget - Fatal编程技术网

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

C++ 如何在QListWidget中缩放自定义小部件?,c++,qt,qt5,qwidget,qlistwidget,C++,Qt,Qt5,Qwidget,Qlistwidget,我创建了一个自定义小部件,它包括一个垂直布局,带有一个qlabel(包含一个图标)和一个qcombobox 我将它们用作listwidget项。 它们是基于具有100个图标的文件创建的。 我正在尝试创建一个滑块,当应用程序实时运行时,它可以缩放pixmap大小。 我不知道如何正确地编写代码以便访问此属性。 这是mainwindow.cpp中的代码 /*load icons*/ QDir dir (....); QFileInfoList list = dir.entryInfoList(QDir

我创建了一个自定义小部件,它包括一个垂直布局,带有一个qlabel(包含一个图标)和一个qcombobox 我将它们用作listwidget项。 它们是基于具有100个图标的文件创建的。 我正在尝试创建一个滑块,当应用程序实时运行时,它可以缩放pixmap大小。 我不知道如何正确地编写代码以便访问此属性。 这是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]);
  }
}
/*加载图标*/
QDir dir(..);
QFileInfoList=dir.entryInfoList(QDir::AllEntries |
QDir::Dirs | QDir::NoDotAndDotDot);
对于(int i=0;ilistWidget));
widget[i]>setMinimumSize(QSize(0150));
/*带标签组合的VB*/
布局。推回(新的QVBoxLayout(小部件[i]);
/*保存图标的Qlabel*/
图.push_back(新的QLabel(小部件[i]);
pic[i]->setPixmap(mypix);
布局[i]>addWidget(pic[i]);
box.push_back(新的QComboBox(小部件[i]);
box[i]->addItem(list.at(i).baseName());
布局[i]->addWidget(框[i]);
QListWidgetItem*QListWidgetItem=新的QListWidgetItem;
ui->listWidget->addItem(qlistwidgetitem);
ui->listWidget->setItemWidget(ui->listWidget->item(i),小部件[i]);
}
}

QListWidgetItem
有一个默认大小,该大小不考虑小部件的大小,解决方案是将小部件的
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);
}


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

什么是push_back?好的,谢谢你的代码,它比我的好得多。但是知道我想访问图标的大小,就像我使用
qlistwidgetitem->setIcon(图标)一样使用滚动条,如
void main window::on_verticalScrollBar_valueChanged(int-value){ui->listWidget->setIconSize(QSize(value,value));}
我不知道如何使用滚动条访问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());
    }
}