Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Заполнить виджет окна...
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt GUI
fortero
Доброй ночи!
Имеется MDI дочернии окна, внутри есть необходимость установить виджет таблице QTableWidget, устанавливается благополучно, а как мне сделать, что бы таблица равномерно увеличивалась при увиличении окна, а то она статична в размере, дочерне окно я увеличил немного или до максимума а размер виджета таблицы остался прежний...
Спасибо за внимание!
silver47
Немного не понял. Имеется окно с QTableWidget, в одной из ячеек которой стоит другой виджет. При изменении размеров окна, размер таблицы меняется, а размер ячейки с виджетом нет?
igor_bogomolov
Используй компоновщики
fortero
Есть окно к примеру хоть класса QMainWindow и в нём нужно построить таблицу при помощи класса QTableWidget, всё получается но размер таблицы не увеличевается с размером окна, она фиксированного размера почему то...
А как припомощи компоновщика правельно задать параметры когда 1 виджет, что бы он занимал всё пространство окна и динамически увеличевался при увиличение окна?
silver47
В приведенном ниже примере установлю 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
Цитата(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
Не понимаю я Вас. Как это помогло но не работает :). Давайте по-порядку. Я сейчас буду картинки прикреплять и объяснять что происходит, в конце поста прилеплю исходник.

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

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

Обещанный код:
ernie
Можно использовать setRowHeight и setColumnWidth при изменении размера, т.е. скажем setRowHeight(tableHeight/rowCount),где tableHeight - общая высота таблицы,так же и с шириной
silver47
Цитата(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)

А если записей в таблице стотышьмилионов, что тогда увидим?
ernie
silver47,ну да,с высотой ячеек я погорячился что-то:))
По поводу как узнать,что размеры таблицы изменились,resizeEvent чем плох?
silver47
ну дык, опишите для страждующих
fortero
Нужно Господа!
Что бы была точка отсчёта, есть окно и есть таблица, базовый размер задан! Высоту строк увеличевать как раз напротив не нужно, а вот ширену столбцов, в ней и загвоздка...
Базовый пример:
Нажмите для просмотра прикрепленного файла
Как вы видите это окно внутри окна, вдруг его прейдётся увеличить, хотелось бы что бы и таблица по ширине не по высоте, увеличилась, или на худой конец только вторая колонка только по ширине увеличилась...
И ещё если вы заметили серую полоску от фона окна наехавшую на таблицу, не подскажите как это вылечить? Если кликнуть то серость проподает, но при появлении первого окна серая линия несколько смущает(((
silver47
Я ничего кроме как создавать свой класс, унаследовав его от 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);
}
wiz29
Цитата(silver47 @ 29.4.2011, 11:23) *
Я ничего кроме как создавать свой класс, унаследовав его от QTableWidget и в нем переопределять resizeEvent, чтобы он испускал сигнал изменения размера, или сам менял размеры ячеек, посоветовать не могу. Господин ernie не желает делиться секретом :). А у меня знаний не хватает :(.

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

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


В коде...
У меня всё в коде, могу дать посмотреть, но только через электронку...
silver47
Мне казалось этот вопрос решили еще тут
Litkevich Yuriy
Цитата(fortero @ 29.4.2011, 21:47) *
У меня всё в коде
показывай код контсруктора субокна.

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

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

Цитата(silver47 @ 30.4.2011, 7:46) *
Мне казалось этот вопрос решили еще тут
похоже на то
fortero
Добрый день!
Извините, что пропал… Конструктор суб окна?
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. Создать свою таблицу, унаследовавшись от сущестующей и добавив необходимый функционал
  2. Установить фильтр событий, отловить событие изменения размера таблицы и обработать его в другом методе


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

UPD: Все тот же Макс Шлее страница 283
fortero
Спасибо большое, Вы по настоящему помогли, всё стало таким каким я и представлял себе! Я под редактировал класс который отвечал за таблицу, и всё просто супер!
Извини меня за глупые вопросы я только начинаю, много читаю но всё не усваивается сразу, а вот когда кто то разжуёт сразу всё понятно и наглядно, к примеру мой класс для таблиц, он заниматься будит разными таблицами и у всех будет разное число столбцов я уже решил с этим проблему но главное Вы всё показали наглядно и понятно!
Есть ещё вопрос: я заметил у вас присутствие в коде деструктора…
Что такое деструктор я имею представление, Шилдта читал, и Страуструпа… Суть в том что бы разрушать объект, это понятно, но в Qt в книжках и в приложениях которые даются в примерах я не замечал а у вас я вижу, объясните как им пользоваться тут он нужен? Для чего вы вписал у себя в коде? Мне эти детали очень важны у меня всегда много вопросов, так как - дело для меня это новое не освоенное! Как говорится в фильме)))
Большое спасибо за внимание и помощь!
silver47
В данной конкретной ситуации деструктор создала сама среда разработки. В нем необходимо уничтожить те объекты, которые были созданы в этом классе, но для которых не установлен родитель. Ну, например, в классе создается указатель на файл, для работы с ним. При уничтожении класса хорошо бы закрыть этот файл и удалить указатель. Или в классе создаете 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
// Для небольших программ это не проблема, если эта программа содержит один виджет - экземпляр этого класса, то после закрытия виджета
// закроется и сама программа, а при закрытии программы этот объект будет уничтожен. В крупных же проектах, где динамически создаются
// и уничтожаются экземпляры разных классов и не по разу - это может вылиться в проблему
}
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.