我有一个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);
是否有办法正确设置sizeHint
关于QWidget
的QLabels
中使用的显示内容的宽度和高度?
例如,第一个QListWidgetItem
的descriptionLabel
的文本长度为300个字符,第二个QListWidgetItem
的descriptionLabel
的文本长度为1000个字符。到目前为止,两个QListWidgetItems
将具有相同的大小(200px宽,180px高)。虽然它可能适合第一个QListWidgetItem
,因为它只有300个字符,但它可能不适合第二个QListWidgetItem
,因为它有1000个字符。因此,我想以某种方式动态调整QListWidgetItem
的大小关于所需的空间(第一个将需要少于第二个)。
在我看来,除非您知道它的未来宽度,否则您将无法为标签获得正确的边界矩形,以便您可以计算显示内容所需的行数。在计算其他小部件的布局之前,你不会得到宽度。
另一种方法可能是使用项委托。它的sizeHint方法有一个带有初始rect的选项参数,您可以从该参数中使用宽度并计算带有字体度量的高度。
关于其他小部件,您可以切换到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());
}
};
希望有帮助,
Johannes