Qt 如何正确获取QListView的大小

Qt 如何正确获取QListView的大小,qt,qlistview,Qt,Qlistview,我正在创建一个简单的小部件,其中包含一个带有图标的qlistview和一个QSlider。小部件是用Qt设计器创建的。我想做的是让我的图标正好适合QListView的高度,这样我就有了一行图标。我试图通过使用从QWidget继承的函数来读取qlistview的高度,但我不断得到一个值,该值始终小于qlistview的实际大小。关于这种行为有什么提示吗 下面是我的部分代码 表单的构造函数: SliderWithButtons::SliderWithButtons(QWidget *parent)

我正在创建一个简单的小部件,其中包含一个带有图标的qlistview和一个QSlider。小部件是用Qt设计器创建的。我想做的是让我的图标正好适合QListView的高度,这样我就有了一行图标。我试图通过使用从QWidget继承的函数来读取qlistview的高度,但我不断得到一个值,该值始终小于qlistview的实际大小。关于这种行为有什么提示吗

下面是我的部分代码

表单的构造函数:

SliderWithButtons::SliderWithButtons(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::SliderWithButtons)
{
    ui->setupUi(this);



    //ui->commandListView->setStyleSheet(" QListView { background-color: lightgray }");
    ui->commandListView->setViewMode(QListView::IconMode);
    ui->commandListView->setFlow(QListView::LeftToRight);
    ui->commandListView->setWrapping(true);
    ui->commandListView->setMovement(QListView::Static);
    ui->commandListView->setResizeMode(QListView::Adjust);
    ui->commandListView->setLayoutMode(QListView::SinglePass);

    **mIconWidth = ui->commandListView->geometry().height();
    mIconHeight = mIconWidth;**

    ui->commandListView->setGridSize(QSize(mIconWidth,mIconHeight));
    ui->commandListView->setIconSize(QSize(mIconWidth,mIconHeight));

    **iconList = new IconList(this,mIconWidth, mIconHeight);**
    iconList->addIcons();

    ui->commandListView->setModel(iconList);
}
我的模型的数据功能:

QVariant IconList::data(const QModelIndex &index, int role) const
{
    if (!index.isValid())
        return QVariant();

    if (role == Qt::DecorationRole)
        return QIcon(mIcons.value(index.row()).scaled(mIconWidth, mIconHeight,
                         Qt::KeepAspectRatio, Qt::SmoothTransformation));

    return QVariant();
}

该小部件在垂直布局中仅包含QListView和QSlider。问题是,对ui->commandListView->geometry().height()的调用没有给出真正的qlistview高度,我还尝试了ui->commandListView->height()或ui->commandListView->frameGeometry().height()。

我实际上找到了一个解决方案。在你网站上的另一篇文章中,我发现布局中的小部件的大小只是在它们显示在屏幕上之前不久计算出来的。因此,我重写了showEvent()函数,并在showEvent函数中初始化了QListView和模型中图标的大小。我还使用bool值来确保仅对第一个showEvent()执行此操作。难道没有更优雅的解决方案吗?

我做了一个简单的测试,删除了小部件中的布局,并观察到没有布局,我实际上能够读取QListView的大小。我实际上找到了一个解决方案。在你网站上的另一篇文章中,我发现布局中的小部件的大小只是在它们显示在屏幕上之前不久计算出来的。因此,我重写了showEvent()函数,并在showEvent函数中初始化了QListView和模型中图标的大小。我还使用bool值来确保仅对第一个showEvent()执行此操作。难道没有更优雅的解决方案吗?