Здравствуйте!

Помогите, пожалуйста, разобраться.
У меня для одной из колонок QTableView установлен делегат на основе QTextEdit.
В процессе увеличения ширины окна с помощью мыши у меня не так, как хотелось бы, меняется отображение многострочного текста в ячейках QTableView. Вот что получается в процессе увеличения ширины окна (см. рис1):

Из всех состояний выглядят так, как я предполагала и хотела, только состояния 1, 3, 4, 8, 10, 12. В этих состояниях текст отображается не сокращенно, а полностью.
Как сделать так, чтобы текст всегда отображался полностью - не понимаю. (Безусловно, я учитываю то, что это возможно только в том случае, если места, отведенного для QTableView в окне, хватает для отображения хотя бы одного самого широкого слова из текста всех ячеек таблицы.)Предполагаю следующее.
Когда из состояния 1 я расширяю окно, то в тот момент, когда текст в какой-то ячейке может уже занять меньшее количество строк, tableView->verticalHeader() пересчитывает высоту строк tableView. Но почему-то
при этом текст сначала отображается сокращенно, а позже, при дальнейшем расширении окна, отображается уже полностью.
Потом все это повторятся с какой-нибудь другой ячейкой.Смотрела тут на форуме темы:
http://www.forum.crossplatform.ru/index.ph...ents+QTableView("QTableView::resizeColumnsToContents, неожидаемое поведение")
и
http://www.forum.crossplatform.ru/index.ph...leView&st=0("Изменение высоты и ширины ячеек., QTableView").
Но решения не нашла. Смотреть исходники Qt для меня сложно.
Код у меня такой:
создание делегата:
http://www.forum.crossplatform.ru/index.php?showtopic=8385#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QtGui/QMainWindow>
class QStandardItemModel;
class QTableView;
#include "delegate.h"
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
private:
QStandardItemModel* model;
QTableView* tableView;
TextEditDelegate* delegate;
};
#endif // MAINWINDOW_H
#include <QtGui/QStandardItemModel>
#include <QtGui/QTableView>
#include <QtGui/QHeaderView>
#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
model = new QStandardItemModel(5, 2);
tableView = new QTableView();
delegate = new TextEditDelegate();
for (int row = 0; row < 5; ++row) {
for (int column = 0; column < 2; ++column) {
QModelIndex index = model->index(row, column, QModelIndex());
switch(column)
{
case 0:
model->setData(index, QVariant(
row+1)); break;
default:
switch(row)
{
case 0:
model->setData(index, QVariant(
"")); break;
case 1:
model->setData(index, QVariant(
"Абв"
" PRIVETPRIVET 1 01234"
" PRIVET 2 01234"
" PRIVET 3 01234"
" PRIVET 4 01234")); break;
case 2:
model->setData(index, QVariant(
"PRIVET PRIVET 1 01234"
" Абв"
" PRIVET 2 01234"
" PRIVET 3 01234"
" PRIVET 4 01234")); break;
case 3:
model->setData(index, QVariant(
"Абв"
" PRIVETPRIVET 1 01234"
" PRIVET 2 01234"
" PRIVET 3 01234")); break;
default:
model->setData(index, QVariant(
"Абв"
" PRIVETPRIVET 1 01234"
" PRIVET 2 01234"
" PRIVET 3 01234"
" PRIVET 4 01234")); break;
}
break;
}
}
}
tableView->setModel(model);
tableView->setItemDelegateForColumn(1, delegate);
tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
tableView->setSelectionMode(QAbstractItemView::SingleSelection);
tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
tableView->resizeColumnToContents(0);
tableView->horizontalHeader()->setStretchLastSection(true);
tableView->verticalHeader()->hide();
tableView->verticalHeader()->setResizeMode(QHeaderView::ResizeToContents);
if (model->rowCount() > 0)
tableView->setCurrentIndex(model->index(0, 0));
setCentralWidget(tableView);
setWindowTitle("Text Edit Delegate");
setGeometry(100, 250, 170, 500);
}
MainWindow::~MainWindow()
{
}
Подумала, что надо использовать
tableView->verticalHeader()->setResizeMode(QHeaderView::ResizeToContents);
чтобы высота строк tableView пересчитывалась автоматически.
Если отремить строкуtableView->setTextElideMode(Qt::ElideNone);
то возникает другая проблема. В этом случае текст всегда отображается не сокращенно, а полностью. Но зато высота строк tableView пересчитывается неверно и возникают состояния, когда высота получается меньше, чем необходимо для отображения всего текста ячеек. Вот так (см. рис2):

Так тоже не получается то, что хочется:#include <QtCore/QTextCodec>
#include <QtGui/QApplication>
#include "mainwindow.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("Windows-1251"));
MainWindow mainWindow;
mainWindow.show();
mainWindow.slot_resizeRowsToContents();
return app.exec();
}
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
...
connect(this->btn_resizeRowsToContents, SIGNAL(clicked()),
this, SLOT(slot_resizeRowsToContents()));
...
}
void MainWindow::slot_resizeRowsToContents()
{
setUpdatesEnabled(false);
tableView->resizeRowsToContents();
setUpdatesEnabled(true);
tableView->update();
}
В этом случае, после нажатия кнопки "resizeRowsToContents", текст иногда продолжает отображаться сокращенно, вот так (см. рис3):

Может быть, я не в том порядке что-то пишу в своем коде? Или вообще что-то не так делаю?
В этом архиве - папка с файлами проекта и картинками экрана:
test_texteditdelegate_forum1.zip ( 128.14 килобайт )
Кол-во скачиваний: 282
Сообщение отредактировал Steklova Olga - 2.4.2012, 19:02