6

私は を持っており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);

sizeHintで使用される表示コンテンツの幅と高さに関して、適切に設定する方法はありますQLabelsQWidget?

たとえば、最初QListWidgetItemの にはdescriptionLabelテキスト長が 300 文字の があり、2 番目にQListWidgetItemdescriptionLabelテキストの長さが 1000 文字の があります。これまでのところ、両方ともQListWidgetItems同じサイズ (幅 200px、高さ 180px) です。最初のQListWidgetItemには 300 文字しかないため収まるかもしれませんQListWidgetItemが、1000 文字のため 2 番目の には収まらない可能性があります。QListWidgetItemしたがって、必要なスペースに関して何らかの方法で動的にサイズを調整したいと思います(最初のものは2番目のものよりも少なくて済みます)。

4

1 に答える 1

0

私の見方では、コンテンツを表示するために必要な行数を計算できるように、将来の幅がわからない限り、ラベルの正しい境界四角形を取得することはできません。また、他のウィジェットとのレイアウトが計算される前に幅を取得することはできません。

別の方法として、アイテム デリゲートを使用することもできます。その 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());
    }
};

それが役に立てば幸い、

ヨハネス

于 2014-08-15T16:48:56.223 に答える