crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> QTableWidget, WordWrap и высота строки
Amadey
  опции профиля:
сообщение 17.10.2014, 15:42
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 11
Регистрация: 1.4.2013
Пользователь №: 3773

Спасибо сказали: 0 раз(а)




Репутация:   1  


Всем доброго времени суток.
Как сделать что бы текст полностью входил в ячейку меняя высоту ячейки?
Я сделал перенос строки таким образом:
ui->tableWidget->item(rowsc-1,i)->setTextAlignment(Qt::TextWordWrap);

но перенос происходит только в пределах текущей высоты ячейки, не меняя её, т.е. если высоты ячейки хватает на две строки, то перенос будет только один на середине текста, и всё что не войдёт обрежется по ширине.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 17.10.2014, 22:56
Сообщение #2


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Во первых, в 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
  опции профиля:
сообщение 21.10.2014, 11:44
Сообщение #3


Студент
*

Группа: Новичок
Сообщений: 11
Регистрация: 1.4.2013
Пользователь №: 3773

Спасибо сказали: 0 раз(а)




Репутация:   1  


Цитата(lanz @ 17.10.2014, 23:56) *
Во первых, в setTextAlignment нельзя передать Qt::TextWordWrap, это член другого перечисления:

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

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 21.10.2014, 22:09
Сообщение #4


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


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

Хорошо, но чтобы это в последний раз :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
  опции профиля:
сообщение 23.10.2014, 15:46
Сообщение #5


Студент
*

Группа: Новичок
Сообщений: 11
Регистрация: 1.4.2013
Пользователь №: 3773

Спасибо сказали: 0 раз(а)




Репутация:   1  


Разгром по всем пунктам :(
Нужно быть внимательнее.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 20.4.2024, 10:46