c++ - QListWidgetItem - 根据内容调整宽度和高度

标签 c++ qt qwidget qlabel qlistwidgetitem

我有一个 QListWidgetItem,它有一个 QWidget 和一些 QLabels。标签(imageLabeltitleLabeldescriptionLabel)的高度因文本长度而异。 QWidget 的高度也是如此,这导致 QListWidgetItem 中的大小不同。到目前为止,setSizeHint 的参数是静态的:

QListWidgetItem* listWidgetItem = new QListWidgetItem();
listWidgetItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
listWidgetItem->setSizeHint(200, 180));

QWidget* widget = new QWidget();

QVBoxLayout* rootLayout = new QVBoxLayout();
rootLayout->setAlignment(Qt::AlignTop);

QHBoxLayout* contentLayout = new QHBoxLayout();
contentLayout->setAlignment(Qt::AlignLeft);

QLabel* imageLabel = new QLabel();
imageLabel->setPixmap(pixmap);

contentLayout->addWidget(imageLabel, 0, Qt::AlignTop);

QVBoxLayout* informationLayout = new QVBoxLayout();
informationLayout->setAlignment(Qt::AlignTop);

QLabel* titleLabel = new QLabel("<b>" + title  + "</b>");
titleLabel->setWordWrap(true);
informationLayout->addWidget(titleLabel);

QLabel* descriptionLabel = new QLabel(description);
descriptionLabel->setWordWrap(true);
informationLayout->addWidget(descriptionLabel);

QLabel* dateLabel = new QLabel(date.toString());
informationLayout->addWidget(dateLabel);

contentLayout->addLayout(informationLayout);

rootLayout->addLayout(contentLayout);

QHBoxLayout* buttonLayout = new QHBoxLayout();
QPushButton* buttonOne = new QPushButton(tr("Button 1"));
QObject::connect(buttonOne, SIGNAL(clicked()), mButtonOneSignalMapper, SLOT(map()));
mButtonOneSignalMapper->setMapping(buttonOne, index);
buttonLayout->addWidget(buttonOne);

QPushButton* buttonTwo = new QPushButton(tr("Button 2"));
QObject::connect(buttonTwo, SIGNAL(clicked()), mButtonTwoSignalMapper, SLOT(map()));
mButtonTwoSignalMapper->setMapping(buttonTwo, index);
buttonLayout->addWidget(buttonTwo);

rootLayout->addLayout(buttonLayout);

widget->setLayout(rootLayout);

mListWidget->addItem(listWidgetItem);
mListWidget->setItemWidget(listWidgetItem, widget);

关于QWidgetQLabels 中显示内容的宽度和高度,有没有办法正确设置sizeHint

例如,第一个 QListWidgetItem 可能有一个文本长度为 300 个字符的 descriptionLabel,第二个 QListWidgetItem 可能有一个 descriptionLabel 文本长度为 1000 个字符。到目前为止,QListWidgetItems 将具有相同的大小(200 像素宽度和 180 像素高度)。虽然它可能适合第一个 QListWidgetItem,因为它只有 300 个字符,但它可能不适合第二个 QListWidgetItem,因为它有 1000 个字符。因此,我想以某种方式根据所需空间动态调整 QListWidgetItem 的大小(第一个需要的空间小于第二个)。

最佳答案

在我看来,您将无法获得标签的正确边界矩形,除非您知道它的 future 宽度,以便您可以计算显示内容所需的行数。在计算其他小部件的布局之前,您不会获得宽度。

另一种方法可能是使用项目委托(delegate)。它的 sizeHint 方法有一个带有初始矩形的选项参数,您可以从中使用宽度并使用字体规范计算高度。

关于您的其他小部件,您可以切换到 QTableWidget 并将它们放在其他列中..

以下代码不是一个工作示例..只是一些帮助您入门的线索..

class ItemDelegate : public QStyledItemDelegate
{
public:

    void paint ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const
    {
        painter->save();

        QStyledItemDelegate::paint(painter,option,index);

        QString title = index.data(Qt::UserRole).toString();
        QFont f = option.font;
        painter->setFont(f);
        QFontMetrics fm(f);

        QRect r = option.rect;
        // r = r.adjusted(0, fm.lineSpacing(), 0, 0);
        painter->drawText(r.left(), r.top(), r.width(), r.height(), Qt::AlignTop|Qt::AlignLeft|Qt::TextWordWrap, title, &r);

        painter->restore();
    }

    QSize sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const
    {
        QFont f = option.font;
        QRect r = option.rect;
        QFontMetrics fm(f);
        QString title = index.data(Qt::UserRole).toString();
        QRect br = fm.boundingRect(r,Qt::AlignTop|Qt::AlignLeft | Qt::TextWordWrap,title);
        return QSize(option.rect.width(),br.height());
    }
};

希望对你有帮助

约翰内斯

关于c++ - QListWidgetItem - 根据内容调整宽度和高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25158136/

相关文章:

C++ 可拖动无边框窗口问题

php - C++ PHP 和静态库

qt - qt中QSignalMapper如何传递参数

c++ - qt soap 客户端 + ASP.net Web 服务

c++ - 如何从父级不是 QMainWindow 的 QWidget 访问 QMainWindow

qt - QPainter::drawPixmap()看起来不好并且质量低劣?

c++ - 是否以某种方式优化了对同一类成员的连续多次访问?

c++ - QGraphicsDropShadowEffect 仅适用于 ui 上的一项,尽管我到处都使用它

c++ - 使用代码在 QMain WIndow 上的 QT 中添加布局

qt - 隐藏的QWidget对象接收信号