Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Raks123 от Апрель 16, 2012, 21:25



Название: Хитрый способ захвата данных из QTableView
Отправлено: Raks123 от Апрель 16, 2012, 21:25
Проблем несколько:
1. Необходимо взять данные из ячейки, причем выделена только строка (не важно какой элемент в ней), а колонка известна. Для ячейки под номером (0,0), (0,1), .... (0,n) это работает, если выделена именно она:
Код:
qDebug() << ui->tableView->currentIndex().data().toInt();
но очень бы хотелось для красоты, чтобы без разницы было, а возвращало первую ячейку любой строки.

2. Интересно можно ли как нибудь сделать, чтобы при присоединении модели (QSqlTableModel) QTableView и Форма (Widget) автоматически удлинялись, чтобы не было нижнего скрола, а то растягивать это дело ваще, ну очень позорно как-то.


Название: Re: Хитрый способ захвата данных из QTableView
Отправлено: GreatSnake от Апрель 17, 2012, 07:51
но очень бы хотелось для красоты, чтобы без разницы было, а возвращало первую ячейку любой строки.
Код
C++ (Qt)
ui->tableView->model()->index( ui->tableView->currentIndex().row(), 0 ).data().toInt();
 
Цитировать
2. Интересно можно ли как нибудь сделать, чтобы при присоединении модели (QSqlTableModel) QTableView и Форма (Widget) автоматически удлинялись, чтобы не было нижнего скрола, а то растягивать это дело ваще, ну очень позорно как-то.
Код
C++ (Qt)
ui->tableView->horizontalHeader()->setResizeMode( QHeaderView::Stretch );


Название: Re: Хитрый способ захвата данных из QTableView
Отправлено: Raks123 от Апрель 17, 2012, 08:51
Спасибо большое, первое отлично работает))))) А вот во втором убирается скрол, но форма остается такой же, как её поменять под ширину столбцов?


Название: Re: Хитрый способ захвата данных из QTableView
Отправлено: GreatSnake от Апрель 17, 2012, 10:32
Спасибо большое, первое отлично работает))))) А вот во втором убирается скрол, но форма остается такой же, как её поменять под ширину столбцов?
Попробуй так:
Код
C++ (Qt)
ui->tableView->setMinimumWidth( ui->tableView->sizeHint().width() );


Название: Re: Хитрый способ захвата данных из QTableView
Отправлено: Raks123 от Апрель 17, 2012, 10:58
Попробуй так:
Код
C++ (Qt)
ui->tableView->setMinimumWidth( ui->tableView->sizeHint().width() );

ничего не поменялось))


Название: Re: Хитрый способ захвата данных из QTableView
Отправлено: GreatSnake от Апрель 17, 2012, 12:19
Тогда так:
Код
C++ (Qt)
ui->tableView->setMinimumWidth(
ui->tableView->frameWidth() * 3 +
ui->tableView->visualRect(
ui->tableView->model()->index( 0, ui->tableView->model()->columnCount() - 1 ) ).right() +
ui->tableView->verticalHeader()->width() );
 


Название: Re: Хитрый способ захвата данных из QTableView
Отправлено: Raks123 от Апрель 17, 2012, 12:44
Код:
Получится, если сделать вот так:

//    ui->tableView->resizeColumnsToContents();
//    ui->tableView->horizontalHeader()->setResizeMode( QHeaderView::Stretch );
//    ui->tableView->verticalHeader()->setResizeMode(QHeaderView::ResizeToContents);
    ui->tableView->setMinimumWidth(
            ui->tableView->frameWidth() * 3 +
            ui->tableView->visualRect(
                    ui->tableView->model()->index( 0, ui->tableView->model()->columnCount() - 1 ) ).right() +
            ui->tableView->verticalHeader()->width() );

Но без первых трех выраниваний получается уж очень некрасиво (рис 2) по сравнению с тем, что получалось (рис 1)


Название: Re: Хитрый способ захвата данных из QTableView
Отправлено: GreatSnake от Апрель 17, 2012, 12:51
Ну а зачем убрал:
Код
C++ (Qt)
ui->tableView->resizeColumnsToContents();
?


Название: Re: Хитрый способ захвата данных из QTableView
Отправлено: Raks123 от Апрель 17, 2012, 13:21
Вооооот! ;D Вот так просто идеально)))))

Код:
    ui->tableView->resizeColumnsToContents();
    ui->tableView->verticalHeader()->setResizeMode(QHeaderView::ResizeToContents);

    ui->tableView->setMinimumWidth(
            ui->tableView->frameWidth() * 4 +
            ui->tableView->visualRect(
                    ui->tableView->model()->index( 0, ui->tableView->model()->columnCount() - 1 ) ).right() +
            ui->tableView->verticalHeader()->width() );

Поменял в ширение множитель на 4, надо было самое последнее изменение убрать. Огромное спасибо за помощь))))))


Название: Re: Хитрый способ захвата данных из QTableView
Отправлено: Raks123 от Апрель 18, 2012, 07:33
блин не поверишь))) Нашел косяк: когда переключаю qTableView на другую таблицу, то там тоже все нормально (рис1), но вот переключение на более мелкую косячно (рис2)


Название: Re: Хитрый способ захвата данных из QTableView
Отправлено: GreatSnake от Апрель 18, 2012, 10:19
блин не поверишь))) Нашел косяк: когда переключаю qTableView на другую таблицу, то там тоже все нормально (рис1), но вот переключение на более мелкую косячно (рис2)
И в чём косяк? Как задал resizeMode() так себя и ведёт.
Задавай для "узких" таблиц QHeaderView::Stretch.


Название: Re: Хитрый способ захвата данных из QTableView
Отправлено: Raks123 от Апрель 19, 2012, 09:50
И в чём косяк? Как задал resizeMode() так себя и ведёт.
Задавай для "узких" таблиц QHeaderView::Stretch.

Да я уже всяко пробовал, поигрался с
Код:
ui->tableView->horizontalHeader()->setResizeMode( QHeaderView::ResizeToContents );
ui->tableView->horizontalHeader()->setResizeMode( QHeaderView::Stretch);
ui->tableView->setMinimumWidth();
ui->tableView->setMaximumWidth();

Не получается и все тут, более того QHeaderView::Stretch Возвращает ранную проблему со свертыванием записей в таблице


Название: Re: Хитрый способ захвата данных из QTableView
Отправлено: GreatSnake от Апрель 19, 2012, 10:14
Установка другого resizeMode() напрочь убивает лейаут предыдущего. Поэтому устанавливать один и сразу менять на другой кроме тормозов ничего не даст. Не нравится автоматическое поведение выставляй ширину колонок сам через QTableView::setColumnWidth().


Название: Re: Хитрый способ захвата данных из QTableView
Отправлено: Raks123 от Апрель 19, 2012, 11:25
Почти получилось  ;D Кое-что еще не так - когда со второй таблицы на первую переходишь, то таблица то сжимается, но форма остается такой же (рис1). Я уже и спейсер добавил и авторазмер в QtDesiner'e, опять что-то не то (рис2).