Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: QTableWidget, WordWrap и высота строки
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt GUI
Amadey
Всем доброго времени суток.
Как сделать что бы текст полностью входил в ячейку меняя высоту ячейки?
Я сделал перенос строки таким образом:
ui->tableWidget->item(rowsc-1,i)->setTextAlignment(Qt::TextWordWrap);

но перенос происходит только в пределах текущей высоты ячейки, не меняя её, т.е. если высоты ячейки хватает на две строки, то перенос будет только один на середине текста, и всё что не войдёт обрежется по ширине.
lanz
Во первых, в setTextAlignment нельзя передать Qt::TextWordWrap, это член другого перечисления:
http://qt-project.org/doc/qt-4.8/qt.html#AlignmentFlag-enum
http://qt-project.org/doc/qt-4.8/qt.html#TextFlag-enum

Чтобы сделать перенос текста, используйте resizeRow(s)ToContent:
http://qt-project.org/doc/qt-4.8/qtablevie...eRowsToContents

Например так:
    connect( this->ui->tableWidget, SIGNAL(cellChanged(int,int)),
             this->ui->tableWidget, SLOT(resizeRowsToContents()) );
    connect( this->ui->tableWidget->horizontalHeader(), SIGNAL(sectionResized(int,int,int)),
             this->ui->tableWidget, SLOT(resizeRowsToContents()) );
Amadey
Цитата(lanz @ 17.10.2014, 23:56) *
Во первых, в setTextAlignment нельзя передать Qt::TextWordWrap, это член другого перечисления:

Позвольте с вами не согласиться. 1) setTextAlignment принимает в качестве аргумента int, а не член перечисления, 2) AlignmentFlag и TextFlag не пересекаются 3) и самое главное это работает, хоть и не совсем так как нужно.
Ваш вариант работает как нужно, спасибо.

lanz
Цитата
Позвольте с вами не согласиться.

Хорошо, но чтобы это в последний раз :lol:

Из исходников qt:
Вот здесь значение которое вы передали сохраняется в роли Qt::TextAlgnmentRole
qtablewidget.h
    inline void setTextAlignment(int alignment)
        { setData(Qt::TextAlignmentRole, alignment); }

А вот место где оно достается:
qstyleditemdelegate.cpp
    value = index.data(Qt::TextAlignmentRole);
    if (value.isValid() && !value.isNull())
        option->displayAlignment = Qt::Alignment(value.toInt());

И далее:
qcommonstyle.cpp
 const QRect layoutRect = QStyle::alignedRect(option->direction, option->displayAlignment,
                                                 QSize(int(width), int(height)), textRect);
    const QPointF position = layoutRect.topLeft();
    for (int i = 0; i < lineCount; ++i) {
        const QTextLine line = textLayout.lineAt(i);
        if (i == elidedIndex) {
            qreal x = position.x() + line.x();
            qreal y = position.y() + line.y() + line.ascent();
            p->save();
            p->setFont(option->font);
            p->drawText(QPointF(x, y), elidedText);


После чего смотрим в
qstyle.cpp
QRect QStyle::alignedRect(Qt::LayoutDirection direction, Qt::Alignment alignment, const QSize &size, const QRect &rectangle)
{
    alignment = visualAlignment(direction, alignment);
    int x = rectangle.x();
    int y = rectangle.y();
    int w = size.width();
    int h = size.height();
    if ((alignment & Qt::AlignVCenter) == Qt::AlignVCenter)
        y += rectangle.size().height()/2 - h/2;
    else if ((alignment & Qt::AlignBottom) == Qt::AlignBottom)
        y += rectangle.size().height() - h;
    if ((alignment & Qt::AlignRight) == Qt::AlignRight)
        x += rectangle.size().width() - w;
    else if ((alignment & Qt::AlignHCenter) == Qt::AlignHCenter)
        x += rectangle.size().width()/2 - w/2;
    return QRect(x, y, w, h);
}


Цитата
2) AlignmentFlag и TextFlag не пересекаются

Это тоже неверно, но это уже придирки по мелочи :lol:
Цитата
Qt::AlignBaseline 0x0100 Aligns with the baseline.
Qt::TextSingleLine 0x0100 Treats all whitespace as spaces and prints just one line.

Цитата
3) и самое главное это работает, хоть и не совсем так как нужно.

Это вообще не работает, передавать или не передавать - все равно будет перенос по словам в пределах высоты строки.
Только что попробовал.
Amadey
Разгром по всем пунктам :(
Нужно быть внимательнее.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.