crossplatform.ru

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

fortero
  опции профиля:
сообщение 27.4.2011, 1:19
Сообщение #1


Участник
**

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

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




Репутация:   0  


Доброй ночи!
Имеется MDI дочернии окна, внутри есть необходимость установить виджет таблице QTableWidget, устанавливается благополучно, а как мне сделать, что бы таблица равномерно увеличивалась при увиличении окна, а то она статична в размере, дочерне окно я увеличил немного или до максимума а размер виджета таблицы остался прежний...
Спасибо за внимание!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
3 страниц V   1 2 3 >  
Начать новую тему
Ответов (1 - 23)
silver47
  опции профиля:
сообщение 27.4.2011, 4:53
Сообщение #2


Активный участник
***

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

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




Репутация:   6  


Немного не понял. Имеется окно с QTableWidget, в одной из ячеек которой стоит другой виджет. При изменении размеров окна, размер таблицы меняется, а размер ячейки с виджетом нет?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 27.4.2011, 7:52
Сообщение #3


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

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




Репутация:   29  


Используй компоновщики
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
fortero
  опции профиля:
сообщение 27.4.2011, 11:02
Сообщение #4


Участник
**

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

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




Репутация:   0  


Есть окно к примеру хоть класса QMainWindow и в нём нужно построить таблицу при помощи класса QTableWidget, всё получается но размер таблицы не увеличевается с размером окна, она фиксированного размера почему то...
А как припомощи компоновщика правельно задать параметры когда 1 виджет, что бы он занимал всё пространство окна и динамически увеличевался при увиличение окна?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 27.4.2011, 11:17
Сообщение #5


Активный участник
***

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

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




Репутация:   6  


В приведенном ниже примере установлю QTableWidget на виджет:
Widget::Widget(QWidget *parent) : QWidget(parent){
  QHBoxLayout *mainLay = new QHBoxLayout(this);
  mainLay->addWidget(table = new QTableWidget(1, 1, this));
  this->setLayout(mainLay);
}

А так для экземпляра QMainWindow:
this->setCentralWidget(table = new QTableWidget(1, 1, this));
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
fortero
  опции профиля:
сообщение 28.4.2011, 3:06
Сообщение #6


Участник
**

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

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




Репутация:   0  


Цитата(silver47 @ 27.4.2011, 11:17) *
В приведенном ниже примере установлю QTableWidget на виджет:
Widget::Widget(QWidget *parent) : QWidget(parent){
  QHBoxLayout *mainLay = new QHBoxLayout(this);
  mainLay->addWidget(table = new QTableWidget(1, 1, this));
  this->setLayout(mainLay);
}

А так для экземпляра QMainWindow:
this->setCentralWidget(table = new QTableWidget(1, 1, this));


Спасибо помогла с Layout!
А подскажите ещё пожалуйста, а как быть когда начинаешь окно растягивать увеличевать, как сделать что юы при увеличении геометрии окна таблица внутри окна тоже увеличивалась?
Спасибо за внимание...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 28.4.2011, 5:23
Сообщение #7


Активный участник
***

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

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




Репутация:   6  


Не понимаю я Вас. Как это помогло но не работает :). Давайте по-порядку. Я сейчас буду картинки прикреплять и объяснять что происходит, в конце поста прилеплю исходник.

1 Создаем Layout и засовываем в него таблицу. (рис1)
2 При изменении размеров окна, размер таблицы меняется, размер ячеек же остается постоянным!!!! (рис2)
3 Можно растянуть последний столбец, чтобы он занимал все оставшееся место (рис3), но это некрасиво.

Логичным является изменение размера ячеек в зависимости от размеров таблицы. По моему уровню знаний, это сделать сложнее, потому что нужно каким-то образом узнать что размеры таблицы изменились. Кроме как делать свой класс, унаследованный от QTableWidget. Может знающие люди чего посоветуют.

Обещанный код:
Эскизы прикрепленных изображений
 Р В Р’ Р’ Р’ Р’ Р’ Р’ Р’ Р’ Р’ Р в‚¬Р В РЎВ˜Р В Р’µР Р…ьшено Р Т‘Р С• 41%
Прикрепленное изображение
450 x 240 (33.55 килобайт)
 Р В Р’ Р’ Р’ Р’ Р’ Р’ Р’ Р’ Р’ Р в‚¬Р В РЎВ˜Р В Р’µР Р…ьшено Р Т‘Р С• 62%
Прикрепленное изображение
691 x 384 (29.81 килобайт)
 Р В Р’ Р’ Р’ Р’ Р’ Р’ Р’ Р’ Р’ Р в‚¬Р В РЎВ˜Р В Р’µР Р…ьшено Р Т‘Р С• 56%
Прикрепленное изображение
604 x 346 (44 килобайт)
 

Прикрепленные файлы
Прикрепленный файл  temp.zip ( 1.25 килобайт ) Кол-во скачиваний: 170
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ernie
  опции профиля:
сообщение 28.4.2011, 6:59
Сообщение #8


Участник
**

Группа: Участник
Сообщений: 130
Регистрация: 13.5.2010
Из: Irkutsk
Пользователь №: 1712

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




Репутация:   1  


Можно использовать setRowHeight и setColumnWidth при изменении размера, т.е. скажем setRowHeight(tableHeight/rowCount),где tableHeight - общая высота таблицы,так же и с шириной
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 28.4.2011, 8:03
Сообщение #9


Активный участник
***

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

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




Репутация:   6  


Цитата(ernie @ 28.4.2011, 8:59) *
Можно использовать setRowHeight и setColumnWidth при изменении размера, т.е. скажем setRowHeight(tableHeight/rowCount),где tableHeight - общая высота таблицы,так же и с шириной


Блин, А кто спорит то?
Цитата(silver47 @ 28.4.2011, 7:23) *
Логичным является изменение размера ячеек в зависимости от размеров таблицы.


Вы знаете как:
Цитата(silver47 @ 28.4.2011, 7:23) *
нужно каким-то образом узнать что размеры таблицы изменились.
?

ПыСы:
Цитата(ernie @ 28.4.2011, 8:59) *
т.е. скажем setRowHeight(tableHeight/rowCount)

А если записей в таблице стотышьмилионов, что тогда увидим?

Сообщение отредактировал silver47 - 28.4.2011, 8:11
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ernie
  опции профиля:
сообщение 28.4.2011, 8:57
Сообщение #10


Участник
**

Группа: Участник
Сообщений: 130
Регистрация: 13.5.2010
Из: Irkutsk
Пользователь №: 1712

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




Репутация:   1  


silver47,ну да,с высотой ячеек я погорячился что-то:))
По поводу как узнать,что размеры таблицы изменились,resizeEvent чем плох?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 28.4.2011, 9:05
Сообщение #11


Активный участник
***

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

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




Репутация:   6  


ну дык, опишите для страждующих
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
fortero
  опции профиля:
сообщение 28.4.2011, 21:41
Сообщение #12


Участник
**

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

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




Репутация:   0  


Нужно Господа!
Что бы была точка отсчёта, есть окно и есть таблица, базовый размер задан! Высоту строк увеличевать как раз напротив не нужно, а вот ширену столбцов, в ней и загвоздка...
Базовый пример:
 Р В Р’ Р’ Р’ Р’ Р’ Р’ Р’ Р’ Р’ Р в‚¬Р В РЎВ˜Р В Р’µР Р…ьшено Р Т‘Р С• 73%
Прикрепленное изображение
967 x 609 (103.92 килобайт)

Как вы видите это окно внутри окна, вдруг его прейдётся увеличить, хотелось бы что бы и таблица по ширине не по высоте, увеличилась, или на худой конец только вторая колонка только по ширине увеличилась...
И ещё если вы заметили серую полоску от фона окна наехавшую на таблицу, не подскажите как это вылечить? Если кликнуть то серость проподает, но при появлении первого окна серая линия несколько смущает(((
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 29.4.2011, 10:23
Сообщение #13


Активный участник
***

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

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




Репутация:   6  


Я ничего кроме как создавать свой класс, унаследовав его от QTableWidget и в нем переопределять resizeEvent, чтобы он испускал сигнал изменения размера, или сам менял размеры ячеек, посоветовать не могу. Господин ernie не желает делиться секретом :). А у меня знаний не хватает :(.

Есть свое представление, унаследованное от QTableView. Там как раз переопределен resizeEvent могу выложить.... может по аналогии сделаете.

заголовочник:
#ifndef DB_H
#define DB_H

#include <QTableView>
class MyView : public QTableView {
    Q_OBJECT
public:
    MyView(QWidget *parent = 0);
private:
    virtual void resizeEvent(QResizeEvent *event);
};
#endif // DB_H


реализация:
#include <QtGui>
#include <QtSql>

#include "db02.h"
MyView::MyView(QWidget *parent)
      : QTableView(parent) {
}

void MyView::resizeEvent(QResizeEvent *event) {
    // метод, обрабатывающий изменение размера таблицы Здесь Вы можете как испустить сигнал, что размер таблицы изменился
    // так и изменить размеры нужных Вам ячеек. в данном случае высота и ширина ячеек подгоняется под размеры:
    // то что вносим мы:
    resizeRowsToContents();      
    resizeColumnsToContents();
    // остальную реакцию на изменение размера возьмем из стандартного QTableView
    QTableView::resizeEvent(event);
}


Сообщение отредактировал silver47 - 29.4.2011, 10:33
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 29.4.2011, 10:28
Сообщение #14


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

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

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




Репутация:   12  


Цитата(silver47 @ 29.4.2011, 11:23) *
Я ничего кроме как создавать свой класс, унаследовав его от QTableWidget и в нем переопределять resizeEvent, чтобы он испускал сигнал изменения размера, или сам менял размеры ячеек, посоветовать не могу. Господин ernie не желает делиться секретом :). А у меня знаний не хватает :(.

Можно использовать eventFilter для обработки, если нет желания наследоваться.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 29.4.2011, 10:33
Сообщение #15


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(fortero @ 27.4.2011, 4:19) *
а как мне сделать, что бы таблица равномерно увеличивалась при увиличении окна, а то она статична в размере,
научиться пользоваться компоновщиками (QLayout's)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
fortero
  опции профиля:
сообщение 29.4.2011, 16:31
Сообщение #16


Участник
**

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

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




Репутация:   0  


Цитата(Litkevich Yuriy @ 29.4.2011, 10:33) *
Цитата(fortero @ 27.4.2011, 4:19) *
а как мне сделать, что бы таблица равномерно увеличивалась при увиличении окна, а то она статична в размере,
научиться пользоваться компоновщиками (QLayout's)

Но а Вы не подкажите?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 29.4.2011, 16:54
Сообщение #17


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


fortero, как делал субокно? В коде, в дизайнере?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
fortero
  опции профиля:
сообщение 29.4.2011, 18:47
Сообщение #18


Участник
**

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

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




Репутация:   0  


Цитата(Litkevich Yuriy @ 29.4.2011, 16:54) *
fortero, как делал субокно? В коде, в дизайнере?


В коде...
У меня всё в коде, могу дать посмотреть, но только через электронку...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 30.4.2011, 4:46
Сообщение #19


Активный участник
***

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

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




Репутация:   6  


Мне казалось этот вопрос решили еще тут
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 30.4.2011, 20:58
Сообщение #20


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(fortero @ 29.4.2011, 21:47) *
У меня всё в коде
показывай код контсруктора субокна.

П.С.
до секретов ещё ой как далеко, так что выкладывай в форум.

П.П.С.
весь код приложения не интересен и будет лишь захламлять форум

Цитата(silver47 @ 30.4.2011, 7:46) *
Мне казалось этот вопрос решили еще тут
похоже на то
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
fortero
  опции профиля:
сообщение 1.5.2011, 18:26
Сообщение #21


Участник
**

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

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




Репутация:   0  


Добрый день!
Извините, что пропал… Конструктор суб окна?
second.h
#include <QtGui>
#include <QtSql>

#include "dbconnect.h"
#include "tablecl.h"

class SecondWin : public QMainWindow {
    Q_OBJECT
public:
    SecondWin();
    bool newWi(int rwtrig); //Новое окно второго класса
    //
    QString friendWin();
    QString currentFile(){ return curWin; }
    
private:
    QString strName(const QString &fullFN);
    QString curWin;
    //Область второго окна меню и др.
    DbConnect *db;
    TableCl *newtab;
    
    
    ///
};


Я согласен, что секретов нет, да их быть не может просто над кодом работаю я не один, и я не знаю как другие отреагируют…
А вы не могли показать примеры как в Layout упровлять таблицей, что бы Layout автоматом её растягивал???
Вопрос действительно решился с той задачей, так как мне больше 2 колонок не надо…
Но очень скоро понадобится строить таблицы где минимум 5 будет и хотелось решить проблему с автоматическим растягиванием.
Буду очень признателен, спасибо за внимание!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 1.5.2011, 20:16
Сообщение #22


Активный участник
***

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

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




Репутация:   6  


Ну чего Вы так прицепились к этому компоновщику?! Он свое дело сделал - растянул таблицу по своему размеру, а вот то что таблица не умеет изменять размеры своих столбцов под свой размер - это другое дело, нужно ее научить. Научить можно двумя способами
  1. Создать свою таблицу, унаследовавшись от сущестующей и добавив необходимый функционал
  2. Установить фильтр событий, отловить событие изменения размера таблицы и обработать его в другом методе


Как сделать первый вариант я уже писал, применительно к QTableView. Прикрепляю проект с реализацией второго варианта. В нем все та же таблица 5 на 4, в которой столбцы всегда делят размер таблицы в пропорции 10% 25% 25% 40%

UPD: Все тот же Макс Шлее страница 283

Сообщение отредактировал silver47 - 1.5.2011, 20:24
Прикрепленные файлы
Прикрепленный файл  temp.zip ( 2.67 килобайт ) Кол-во скачиваний: 141
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
fortero
  опции профиля:
сообщение 2.5.2011, 0:42
Сообщение #23


Участник
**

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

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




Репутация:   0  


Спасибо большое, Вы по настоящему помогли, всё стало таким каким я и представлял себе! Я под редактировал класс который отвечал за таблицу, и всё просто супер!
Извини меня за глупые вопросы я только начинаю, много читаю но всё не усваивается сразу, а вот когда кто то разжуёт сразу всё понятно и наглядно, к примеру мой класс для таблиц, он заниматься будит разными таблицами и у всех будет разное число столбцов я уже решил с этим проблему но главное Вы всё показали наглядно и понятно!
Есть ещё вопрос: я заметил у вас присутствие в коде деструктора…
Что такое деструктор я имею представление, Шилдта читал, и Страуструпа… Суть в том что бы разрушать объект, это понятно, но в Qt в книжках и в приложениях которые даются в примерах я не замечал а у вас я вижу, объясните как им пользоваться тут он нужен? Для чего вы вписал у себя в коде? Мне эти детали очень важны у меня всегда много вопросов, так как - дело для меня это новое не освоенное! Как говорится в фильме)))
Большое спасибо за внимание и помощь!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 2.5.2011, 5:56
Сообщение #24


Активный участник
***

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

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




Репутация:   6  


В данной конкретной ситуации деструктор создала сама среда разработки. В нем необходимо уничтожить те объекты, которые были созданы в этом классе, но для которых не установлен родитель. Ну, например, в классе создается указатель на файл, для работы с ним. При уничтожении класса хорошо бы закрыть этот файл и удалить указатель. Или в классе создаете QTextDocument для экспорта какого-либо содержимого в файл odt или PDF. Опять же его следует уничтожить, иначе вероятна утечка памяти. Приведу пример еще нагляднее:
Widget::Widget(QWidget *parent) : Qwidget(parent){ // конструктор Вашего виджета
QHBoxLayout *mainLay = new QHBoxLayout(this); // теперь для этого лайаута и для всех элементов, помещенных в него указан родитель
// все они будут автоматически уничтожены при уничтожении экземпляра этого класса
mainLay->addWidget(new Label("Some Text"));     // все в порядке, этот Label будет уничтожен при уничтожении экземпляра класса
memoryLeekLbl = new QLabel("this cause memory leek");  // а это уже утечка памяти.
memoryLeekLbl->show();    
// у этого объекта нет родителя и он не будет уничтожен при уничтожении экземпляра класса Widget
// Для небольших программ это не проблема, если эта программа содержит один виджет - экземпляр этого класса, то после закрытия виджета
// закроется и сама программа, а при закрытии программы этот объект будет уничтожен. В крупных же проектах, где динамически создаются 
// и уничтожаются экземпляры разных классов и не по разу - это может вылиться в проблему
}


Сообщение отредактировал silver47 - 2.5.2011, 5:57
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 21.6.2025, 19:14