QTableWidget and QTableWidgetItem (Появилось несколько вопрос. Qt4)

Модератор: Модераторы разделов

Ответить
Аватара пользователя
Assuri
Сообщения: 678
Статус: #include <brain.h>
ОС: Fedora 12
Контактная информация:

QTableWidget and QTableWidgetItem

Сообщение Assuri »

1. Есть QMainWindow, в центральной части находится QTableWidget. У QTableWidget 1 строка и 5 столбцов. Мне надо, чтобы все эти 5 столбцов занимали всю ширину центральной части, а не половину, как у меня. Как мне это сделать?
2. Как мне сделать так, чтобы QTableWidgetItem растягивался вместе с текстом, устновленным функцией setText()? Когда пишу setSizeHint(xx->sizeHint()) ячейка вообще куда-то пропадает.
Спасибо сказали:
Аватара пользователя
eduard_pustobaev
Сообщения: 2629
Статус: Ленивец
ОС: Arch/Debian.
Контактная информация:

Re: QTableWidget and QTableWidgetItem

Сообщение eduard_pustobaev »

1) У колонок же есть фиксировання ширина. Свойства такого не знаю, но при resizeEvent() виджета можно делать setColumnWidth()...
2) Тут в принципе тоже так же можно сделать. Каждый раз при setText().

P.S. Может и есть стандартное решение, искать неохота. Но вопрос можно решить и так.
В дисгармонии со вселенной.
Спасибо сказали:
Аватара пользователя
Assuri
Сообщения: 678
Статус: #include <brain.h>
ОС: Fedora 12
Контактная информация:

Re: QTableWidget and QTableWidgetItem

Сообщение Assuri »

eduard_pustobaev писал(а):
27.08.2007 15:52
1) У колонок же есть фиксировання ширина. Свойства такого не знаю, но при resizeEvent() виджета можно делать setColumnWidth()...
2) Тут в принципе тоже так же можно сделать. Каждый раз при setText().

P.S. Может и есть стандартное решение, искать неохота. Но вопрос можно решить и так.

Спасибо за идею, но: когда я изменю окно вызевется слот изменения ширины ячейки, однако я ведь не знаю на сколько изменять.
Спасибо сказали:
Аватара пользователя
eduard_pustobaev
Сообщения: 2629
Статус: Ленивец
ОС: Arch/Debian.
Контактная информация:

Re: QTableWidget and QTableWidgetItem

Сообщение eduard_pustobaev »

Ну по количеству символов в строке. Установить текст из трёх, пяти, шести символов и посмотеть насколько изменяется ширина колонки columnWidth(). А там уж и задавать размер соответственно размеру вводимой строки. То есть узнать насколько при увеличении строки на один символ, увеличится ширина колонки. Правда боюсь, что при увеличении размера шрифта(не страшно, можно задать фиксированно и не менять) или того же dpi этот размер может меняться.

P.S. Хотя по-моему это жуткий изврат. Должно быть что-то стандартное. Просто обязано, потому что ситуация абсолютно жизненная, без всяких хитрых выдумок.
В дисгармонии со вселенной.
Спасибо сказали:
Аватара пользователя
ged
Сообщения: 110
ОС: Slackware-current

Re: QTableWidget and QTableWidgetItem

Сообщение ged »

Поищи в Assistant по "stretch". Для Q3Table есть такие штуки: virtual void setColumnStretchable ( int col, bool stretch ) и virtual void setRowStretchable ( int row, bool stretch ). Может еще что-нибудь найдешь. Это по первому пункту.

p.s. Порылся немного, собсно вот:
void QTableView::resizeColumnToContents ( int column ) [slot]
Resizes the given column based on the size hints of the delegate used to render each item in the column.
void QTableView::resizeColumnsToContents () [slot]
Resizes all columns based on the size hints of the delegate used to render each item in the columns.
void QTableView::resizeRowToContents ( int row ) [slot]
Resizes the given row based on the size hints of the delegate used to render each item in the row.
void QTableView::resizeRowsToContents () [slot]
Resizes all rows based on the size hints of the delegate used to render each item in the rows.

Я думаю, это то что ты искал по второму пункту. Хотя может не так понял. Просто начал учить Qt 4. Сижу читаю в "C++ GUI Programming with Qt 4" нечто подобное.
You can't kill time without injuring eternity.
Спасибо сказали:
Аватара пользователя
Assuri
Сообщения: 678
Статус: #include <brain.h>
ОС: Fedora 12
Контактная информация:

Re: QTableWidget and QTableWidgetItem

Сообщение Assuri »

ged писал(а):
28.08.2007 14:09
Я думаю, это то что ты искал по второму пункту. Хотя может не так понял. Просто начал учить Qt 4. Сижу читаю в "C++ GUI Programming with Qt 4" нечто подобное.

Второй пункт - выполнен, спасибо.

А вот что делать с первым так и не понятно... :(
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: QTableWidget and QTableWidgetItem

Сообщение Liksys »

Я честно говоря не понял, что тебе нужно, приложи скриншот того, как есть и скриншот (набросав в дезигнере) как должно быть.
Спасибо сказали:
Аватара пользователя
Assuri
Сообщения: 678
Статус: #include <brain.h>
ОС: Fedora 12
Контактная информация:

Re: QTableWidget and QTableWidgetItem

Сообщение Assuri »

Darth Liksys писал(а):
30.08.2007 10:53
Я честно говоря не понял, что тебе нужно, приложи скриншот того, как есть и скриншот (набросав в дезигнере) как должно быть.


Видите, там таблица занимает половину ширины, а мне надо - всю ширину.

diary.png
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: QTableWidget and QTableWidgetItem

Сообщение Liksys »

Вот, что я накопал:

Код: Выделить всё

int QTableView::columnWidth ( int column ) const
void QTableView::setColumnWidth ( int column, int width )
void QTableView::resizeColumnToContents ( int column )   [slot]
И попробуй с этими функциями + то, что в первом ответе написано.
ЗЫ: Удачи с прогой, если будет готова, то выложи в инет, мне например такая очень нужна ;)
Спасибо сказали:
Аватара пользователя
Assuri
Сообщения: 678
Статус: #include <brain.h>
ОС: Fedora 12
Контактная информация:

Re: QTableWidget and QTableWidgetItem

Сообщение Assuri »

Darth Liksys писал(а):
30.08.2007 11:22
Вот, что я накопал:

Код: Выделить всё

int QTableView::columnWidth ( int column ) const
void QTableView::setColumnWidth ( int column, int width )
void QTableView::resizeColumnToContents ( int column )   [slot]
И попробуй с этими функциями + то, что в первом ответе написано.
ЗЫ: Удачи с прогой, если будет готова, то выложи в инет, мне например такая очень нужна ;)

Ура, получилось! Вот решение:

Код: Выделить всё

void CentralWidget::resizeTable(int diaryWidth)
{
    setColumnWidth(0,round(0.2*diaryWidth));
    setColumnWidth(1,round(0.5*diaryWidth));
    setColumnWidth(2,round(0.15*diaryWidth));
    if ( round(0.13*diaryWidth) < 90 )
        resizeColumnToContents(3);
    else
        setColumnWidth(3,round(0.13*diaryWidth));

}

Есстественно, эта функция вызывается из resizeEvent().

Всем спасибо. Тему можно закрывать.

P.S. Как только доделаю прогу - сразу выложу. Появился даже стимул её доделать :) Однако, когда живешь в общаге СУНЦ НГУ без компа - делать быстро не получается...
Спасибо сказали:
Аватара пользователя
Assuri
Сообщения: 678
Статус: #include <brain.h>
ОС: Fedora 12
Контактная информация:

Re: QTableWidget and QTableWidgetItem

Сообщение Assuri »

Вот у меня есть код:

Код: Выделить всё

void CentralWidget::setRow(int row, QSqlRecord* record)
{
    for ( int i = 1; i < 5; i++ )
    {
        QTextBrowser *browser = new QTextBrowser;
        browser->setText(record->value(i).toString());
        browser->setLineWidth(columnWidth(i-1));
        browser->setMinimumSize(browser->sizeHint());
        if ( i == 4 )
            browser->setAlignment(Qt::AlignCenter);
        setCellWidget(row,i-1,browser);
    }
}

Вот, что гененирует этот код:
diary.png

Однако я не понимаю, что мне нужно добавить в код, чтобы:
1) QTextBrowser имел ширину колонки( оценка дня такую ширину не имеет ).
2) QTextBroser не растягивался, а переносил на слудующую строку текст, если он не вмещается в ширину колонки
3) Высота строк растягивалась в зависимости от текста в QTextBrowser ( resizeRowsToContents() не работает )
Спасибо сказали:
Аватара пользователя
ged
Сообщения: 110
ОС: Slackware-current

Re: QTableWidget and QTableWidgetItem

Сообщение ged »

QTextBrowser - потомок многих других виджетов (например QTextEdit), поэтому не все свойства указываются именно в его описании в Assistant. Но в том же Assistant на странице описания QTextBrowser можно найти ссылки вида: 15 properties inherited from QTextEdit. Переходя по ним можно узнать все свойства виджета и прочее. Например перенос - lineWrapColumnOrWidth или lineWrapMode.
See also: void QTableWidgetItem::setSizeHint или void QTableView::setColumnWidth ( int column, int width ) - это как я понял для ширины колонки.
You can't kill time without injuring eternity.
Спасибо сказали:
Аватара пользователя
eduard_pustobaev
Сообщения: 2629
Статус: Ленивец
ОС: Arch/Debian.
Контактная информация:

Re: QTableWidget and QTableWidgetItem

Сообщение eduard_pustobaev »

-DooM- писал(а):
02.09.2007 06:56
1) QTextBrowser имел ширину колонки( оценка дня такую ширину не имеет ).
2) QTextBroser не растягивался, а переносил на слудующую строку текст, если он не вмещается в ширину колонки
3) Высота строк растягивалась в зависимости от текста в QTextBrowser ( resizeRowsToContents() не работает )

2) void setLineWrapMode ( LineWrapMode mode ) ?
В дисгармонии со вселенной.
Спасибо сказали:
Аватара пользователя
Assuri
Сообщения: 678
Статус: #include <brain.h>
ОС: Fedora 12
Контактная информация:

Re: QTableWidget and QTableWidgetItem

Сообщение Assuri »

Всем спасибо. Все таки решил вместо QTextBrowser использовать QTableWidgetItem - намного удобнее.

Скажите, пожалуйста, как мне сделать так, чтобы пользователь не мог обводить( выбирать ) сразу несколько ячеек в QTableWidget?
Спасибо сказали:
Аватара пользователя
ged
Сообщения: 110
ОС: Slackware-current

Re: QTableWidget and QTableWidgetItem

Сообщение ged »

Добавьте в основном виджете строку:

Код: Выделить всё

setSelectionMode(<название_выделения>);
<название _выделения> можно узнать в Assitant поискав по слову SelectionMode. Жду с нетерпением, когда прога уже будет зарелизена и выставлена для загрузки :)
You can't kill time without injuring eternity.
Спасибо сказали:
Аватара пользователя
Assuri
Сообщения: 678
Статус: #include <brain.h>
ОС: Fedora 12
Контактная информация:

Re: QTableWidget and QTableWidgetItem

Сообщение Assuri »

ged писал(а):
06.09.2007 21:51
Добавьте в основном виджете строку:

Код: Выделить всё

setSelectionMode(<название_выделения>);
<название _выделения> можно узнать в Assitant поискав по слову SelectionMode. Жду с нетерпением, когда прога уже будет зарелизена и выставлена для загрузки :)

Спасибо :) Только, я думаю мой опыт не позволит написать стоющую реалезацию моей идеи...
Спасибо сказали:
Аватара пользователя
Assuri
Сообщения: 678
Статус: #include <brain.h>
ОС: Fedora 12
Контактная информация:

Re: QTableWidget and QTableWidgetItem

Сообщение Assuri »

Когда я ввожу большой текст в QTableWidgetItem получается вот что:
screen.png

Непонятно почему, Qt растягивает высоту колонки на лишние сантиметры. Как мне сделать так, чтобы он растягивал точно по тексту?
Спасибо сказали:
Аватара пользователя
ged
Сообщения: 110
ОС: Slackware-current

Re: QTableWidget and QTableWidgetItem

Сообщение ged »

Попробуй поиграть со scale из QSize.
You can't kill time without injuring eternity.
Спасибо сказали:
Аватара пользователя
Assuri
Сообщения: 678
Статус: #include <brain.h>
ОС: Fedora 12
Контактная информация:

Re: QTableWidget and QTableWidgetItem

Сообщение Assuri »

Непонятная вещь творится с QTableWidget: почему то, когда я нажимаю на какую-нибудь ячейку таблицы, эта ячейка не выделяется ( не загорается ), собственно, как и вся строка, так как я использую функцию: setSelectionBehavior(QAbstractItemView::SelectRows);

Может быть, кто-нибудь знает, что возможно у меня не так? Я забыл, что я сделал до такого эффекта.


Update: сам разобрался, извините :(
Спасибо сказали:
Ответить