0

我正在创建一个简单的小部件,其中包含一个带有图标的 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( )。高度()。

4

1 回答 1

0

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

于 2012-11-15T15:45:34.213 回答