Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: evb87ar от Март 07, 2015, 23:09



Название: Как реализовать аналог FormCreate() из Lazarus
Отправлено: evb87ar от Март 07, 2015, 23:09
Добрый день, форумчане,
прошу вашей помощи в следующем затыке:
есть форма, на форме QSplitter, где болтается два виджета.

Задача: после запуска приложения, изменить размер первого виджета в QSplitter согласно значению из настроек.

Попытки: применение QSplitter.setSizes() в __init__ не приводят к нужному результату, так как форма ещё не знает какие у неё размеры. QSplitter.sizes() выдаёт [<какое-либо число>, 0]

Пробовал делать привязку в resizeEvent, но не нравится мне такой подход, ибо неправильный он какой-то. Да и каждый раз надо значение сохранять, потом вызывать... не то это (как старый паскалист чую).

В Lazarus всё просто и понятно, после FormCreate все размеры форма уже знает, но ещё не отрисована на экране, отсюда и пляши, как говорится.

Соответственно вопрос: как реализовать однократную обработку при запуске приложения\показе формы? Или есть какой-то другой способ?

UPD: showEvent() не подходит, так как на этот момент времени размер формы является тем, какой установлен в качестве минимального. А окно может быть открыто как на весь экран, так и с минимальными размерами (смотря как пользователь закрыл).

UPD 2: sizes() после showMaximized() из отдельной функции так же возвращает минимальные размеры формы.


Название: Re: Как реализовать аналог FormCreate() из Lazarus
Отправлено: gil9red от Март 07, 2015, 23:26
Похожая тема http://www.prog.org.ru/topic_28319_0.html ;)


Название: Re: Как реализовать аналог FormCreate() из Lazarus
Отправлено: evb87ar от Март 07, 2015, 23:37
gil9red, благодарствую, как вариант подходит :)


Название: Re: Как реализовать аналог FormCreate() из Lazarus
Отправлено: Igors от Март 08, 2015, 08:58
Ну в первый раз тоже устанавливать надо  :) Я выкручивался так
Код
C++ (Qt)
class CSplitter : public QSplitter {
public:
CSplitter( QWidget * parent ) : QSplitter(parent), mSavedPos(0) {}
 
void resizeEvent( QResizeEvent * e )
{
QSplitter::resizeEvent(e);
int pos = mSavedPos;
mSavedPos = 0;
if (pos) moveSplitter(pos, 1);
}
 
      int GetPos( void ) const
      {
         return handle(1)->x();
      }
 
int mSavedPos;
};
 
И заряжать mSavedPos