Russian Qt Forum
Ноябрь 01, 2024, 02:56 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 [3] 4 5 6   Вниз
  Печать  
Автор Тема: Получаю не правильный размер widget'a и маленький вопрос о include  (Прочитано 38887 раз)
spectre71
Гость
« Ответ #30 : Декабрь 13, 2009, 21:48 »

А откуда adjustSize узнает что ты будешь вызывать именно show(), а не showFullScreen() или showMaximized()?
А мне не нужно "на все случаи" - пусть сделает для размеров установленных setSize. А когда у меня получившиеся размеры будут на руках я задам кому надо setMinimumSize/setMaximumSize а остальное пусть лайауты занимаются. Так ведь нет такой возможности  Плачущий

Не получится.  Грустный Задача в общем случае неразрешима. Но разрешима для текущего состояния.
Записан
SABROG
Гость
« Ответ #31 : Декабрь 13, 2009, 21:48 »

Кстати так тоже вполне работает...:

Код
C++ (Qt)
Widget::Widget(QWidget *parent) :
   QWidget(parent),
   ui(new Ui::Widget)
{
   ui->setupUi(this);
 
   qDebug() << ui->groupBox->geometry() << ui->listView->geometry() << ui->pushButton->geometry();
   show();
   qDebug() << ui->groupBox->geometry() << ui->listView->geometry() << ui->pushButton->geometry();
}
 

Код:
QRect(0,0 100x30) QRect(0,0 100x30) QRect(0,0 100x30)
QRect(11,216 324x13) QRect(92,11 243x199) QRect(11,99 75x23)
Записан
spectre71
Гость
« Ответ #32 : Декабрь 13, 2009, 21:50 »

Тогда все нормально, все что хотели получаем?  Улыбающийся

Так нет подобного метода "calculateSize"! Надо чтоб тролли его еще сделали.
Записан
BRE
Гость
« Ответ #33 : Декабрь 13, 2009, 21:52 »

Так нет подобного метода "calculateSize"! Надо чтоб тролли его еще сделали.
Подожди, мы в конструкторе можем получить размеры и положения всех дочерних виджетов, или какой размер хотим получить?
Записан
spectre71
Гость
« Ответ #34 : Декабрь 13, 2009, 21:53 »

Кстати так тоже вполне работает...:

Код
C++ (Qt)
...

Код:
QRect(0,0 100x30) QRect(0,0 100x30) QRect(0,0 100x30)
QRect(11,216 324x13) QRect(92,11 243x199) QRect(11,99 75x23)

Ужасс.. Улыбающийся
show прямо в конструкторе, прикольно. Не пробовал.
Но задача определить размеры до show!
Записан
BRE
Гость
« Ответ #35 : Декабрь 13, 2009, 21:59 »

Код
C++ (Qt)
QVBoxLayout *layout = new QVBoxLayout( this );
 
QLabel *label = new QLabel( tr( "Label" ), this );
layout->addWidget( label );
 
QTextEdit *textEdit = new QTextEdit( this );
textEdit->setMinimumSize( 400, 400 );
layout->addWidget( textEdit );
 
setLayout( layout );
 
qDebug() << minimumSize();
qDebug() << layout->activate();
qDebug() << minimumSize();
 

Виджет будет создан (если он не будут помещен в другой layout) размером minimumSize().
« Последнее редактирование: Декабрь 13, 2009, 22:03 от BRE » Записан
spectre71
Гость
« Ответ #36 : Декабрь 13, 2009, 22:06 »

Так нет подобного метода "calculateSize"! Надо чтоб тролли его еще сделали.
Подожди, мы в конструкторе можем получить размеры и положения всех дочерних виджетов, или какой размер хотим получить?

Не совсем так. Попытаюсь описать концепцию:
Главное - не важно когда и где(в конструкторое ли позже) мы хотим определить размеры. Важна текущая компоновка и состояние(может зависит от данных) визуальных объектов.
Теперь:
1) calculateSize - расчитывает размеры this в зависимости от текущего состояния и компоновки дочерних элементов
2) calculateSize для элемента(не окна) расчитывает его текущие размеры в зависимости от размеров его "главного" родителя(окна). При необходимости calculateSize дочернего элемента делает вызов calculateSize "главного" родителя
« Последнее редактирование: Декабрь 13, 2009, 22:08 от Spectre » Записан
BRE
Гость
« Ответ #37 : Декабрь 13, 2009, 22:10 »

Не совсем так. Попытаюсь описать концепцию:
Главное - не важно когда и где(в конструкторое ли позже) мы хотим определить размеры. Важна текущая компоновка и состояние(может зависит от данных) визуальных объектов.
Теперь:
1) calculateSize - расчитывает размеры this в зависимости от текущего состояния и компоновки дочерних элементов
2) calculateSize для элемента(не окна) расчитывает его текущие размеры в зависимости от размеров его "главного" родителя(окна). При необходимости calculateSize дочернего элемента делает вызов calculateSize "главного" родителя
Смотри выше, это возвращает minimumSize().

Код
C++ (Qt)
MainWindow::MainWindow()
: QWidget( 0 )
{
QVBoxLayout *layout = new QVBoxLayout( this );
 
QLabel *label = new QLabel( tr( "Label" ), this );
layout->addWidget( label );
 
QTextEdit *textEdit = new QTextEdit( this );
textEdit->setMinimumSize( 400, 400 );
layout->addWidget( textEdit );
 
setLayout( layout );
 
qDebug() << layout->activate();
qDebug() << minimumSize(); // Печатаем размер виджета
}
 
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MainWindow *mw = new MainWindow();
mw->show();
qDebug() << mw->size(); // Проверяем после show
return app.exec();
}
 
Цитировать
QSize(422, 444)
QSize(422, 444)
« Последнее редактирование: Декабрь 13, 2009, 22:12 от BRE » Записан
SABROG
Гость
« Ответ #38 : Декабрь 13, 2009, 22:13 »

3 варианта показывают одни и те же результаты:

  • show();
  • QTimer::singleShot(0, this, SLOT(myslot()));
  • layout()->activate();

Первый может показаться не логичным и громоздким, а также не соответствовать логике приложения, если пользователь не собирается показывать окно, а скрывать его повторно накладно. Второй сложен и не соответствует требованию определить размеры или координаты виджета внутри конструктора. Третий не работает для простых виджетов, где просто может не быть компановщиков, однако в этом случае координаты и размеры у меня возвращаются без проблем и лишних телодвижений. Полагаю, что наличие компановщика заставляет Qt "затирать" размеры и координаты виджетов.
« Последнее редактирование: Декабрь 13, 2009, 22:18 от SABROG » Записан
spectre71
Гость
« Ответ #39 : Декабрь 13, 2009, 22:17 »

Не совсем так. Попытаюсь описать концепцию:
Главное - не важно когда и где(в конструкторое ли позже) мы хотим определить размеры. Важна текущая компоновка и состояние(может зависит от данных) визуальных объектов.
Теперь:
1) calculateSize - расчитывает размеры this в зависимости от текущего состояния и компоновки дочерних элементов
2) calculateSize для элемента(не окна) расчитывает его текущие размеры в зависимости от размеров его "главного" родителя(окна). При необходимости calculateSize дочернего элемента делает вызов calculateSize "главного" родителя
Смотри выше, это возвращает minimumSize().

Ну если бы все было так просто, то не было бы у нас проблем с тем же QTabWidget.
И причем здесь minimumSize. Интересуют размеры/положение объекотв на текущий момент такие, какие были бы если бы мы их начали визуализировать(show) в данный момент, в данном состоянии.
Записан
spectre71
Гость
« Ответ #40 : Декабрь 13, 2009, 22:20 »

3 варианта показывают одни и те же результаты:

  • show();
  • QTimer::singleShot(0, this, SLOT(myslot()));
  • layout()->activate();

Третий не работает для простых виджетов, где просто может не быть компановщиков, однако в этом случае координаты и размеры у меня возвращаются без проблем и лишних телодвижений.

Для приведенного мной примера с QTabWidget - не поможет.
Записан
BRE
Гость
« Ответ #41 : Декабрь 13, 2009, 22:22 »

Ну если бы все было так просто, то не было бы у нас проблем с тем же QTabWidget.
И причем здесь minimumSize. Интересуют размеры/положение объекотв на текущий момент такие, какие были бы если бы мы их начали визуализировать(show) в данный момент, в данном состоянии.
Не пойму что еще не устраивает?
В конструкторе виджета мы получаем размер, который он будет иметь после show() - смотрим minimumSize().
Геометрию дочерних виджетов так же получаем - смотрим geometry().
Записан
BRE
Гость
« Ответ #42 : Декабрь 13, 2009, 22:23 »

Для приведенного мной примера с QTabWidget - не поможет.
Не поможет, потому что размер главного виджета будет подобран в соответствии с minimumSize первой видимой страницы.
Но вроде хотели размеры в конструкторе получить, не?
Записан
SABROG
Гость
« Ответ #43 : Декабрь 13, 2009, 22:26 »

При переключении вкладок должны меняться размеры главного окна, правильно? Т.е. логика как здесь: http://crossplatform.ru/node/242
Записан
spectre71
Гость
« Ответ #44 : Декабрь 13, 2009, 22:29 »

Ну если бы все было так просто, то не было бы у нас проблем с тем же QTabWidget.
И причем здесь minimumSize. Интересуют размеры/положение объекотв на текущий момент такие, какие были бы если бы мы их начали визуализировать(show) в данный момент, в данном состоянии.
Не пойму что еще не устраивает?
В конструкторе виджета мы получаем размер, который он будет иметь после show() - смотрим minimumSize().
Геометрию дочерних виджетов так же получаем - смотрим geometry().

Я не понял, как ты хочешь получить эти размеры(точно такие, какие будут после show() ) ??
Записан
Страниц: 1 2 [3] 4 5 6   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.126 секунд. Запросов: 20.