我有一个 QListWidgetItem
,它有一个 QWidget
和一些 QLabels
。标签(imageLabel
、titleLabel
和 descriptionLabel
)的高度因文本长度而异。 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);
关于QWidget
的QLabels
中显示内容的宽度和高度,有没有办法正确设置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/