Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Maksim от Май 23, 2011, 12:56



Название: Не могу решить тривиалную проблему с размерами окна :-(
Отправлено: Maksim от Май 23, 2011, 12:56
Всем Привет!

Не могу решить тривиалную проблему :-(

Хочу сосдать информационно уведомительное окно, как типо в Mozilla Thunderbird.
Окно появляетса каждий раз как поступает новая информация в нижнем правом углу desktop.
Информационные строчки (QLabel) добавляютса динамически, соответсвенно изменяетса geometry окна и его надо перемешать в плоскости.

Вопрос: КАК  добратса до актуалного размера окна чтоб сделать ету простую операцию:


Код:
void MyWidget::calcSizeAndMove()
{
  //move widget   to the right bottom corner
   int iWidth  = MyWidgetHeight;
   int iHeight = MyWidgetWidth;
   QRect rect  = QApplication::desktop()->availableGeometry();   
   int x       = rect.width()-iWidth;
   int y       = rect.height()-iHeight;
   move(QPoint(x,y));
}

Заранее благодарю за помошь!

Maksim


Название: Re: Не могу решить тривиалную проблему с размерами окна :-(
Отправлено: GreatSnake от Май 23, 2011, 12:58
Код
C++ (Qt)
QWidget::adjustSize();
QWidget::size();
или
QWidget::frameSize();
 


Название: Re: Не могу решить тривиалную проблему с размерами окна :-(
Отправлено: Maksim от Май 23, 2011, 13:26
спасибо! size() уже луче но ещё не совсем то что надо... пробую frameSize()...


Название: Re: Не могу решить тривиалную проблему с размерами окна :-(
Отправлено: m_ax от Май 23, 2011, 15:31
спасибо! size() уже луче но ещё не совсем то что надо... пробую frameSize()...
Перед тем как вызывать size() нужно сделать adjustSize(), как написал GreatSnake.


Название: Re: Не могу решить тривиалную проблему с размерами окна :-(
Отправлено: Maksim от Май 23, 2011, 16:13
Собрал неболшой пример. Думаю так будет легче для всех.  Надеюс кто нить найдёт мою ошибку....
СПАСИБО!!!


Название: Re: Не могу решить тривиалную проблему с размерами окна :-(
Отправлено: Maksim от Май 23, 2011, 17:15
Есть идеи?


Название: Re: Не могу решить тривиалную проблему с размерами окна :-(
Отправлено: m_ax от Май 23, 2011, 17:16
Собрал неболшой пример. Думаю так будет легче для всех.  Надеюс кто нить найдёт мою ошибку....
СПАСИБО!!!
Нужно заменить Qt::SplashScreen на Qt::ToolTip.
По впечатлениям, написано криво.. К тому же пришлось править ваш код под линем, чтоб он нормально собрался..
Пишите в инклудах Qt - шные классы правильно, например:
Код
C++ (Qt)
#include <QDesktopWidget>
 
вместо
Код
C++ (Qt)
#include <qdesktopwidget>
 
Ещё не понял, зачем создавать целый список QLabel, вместо того, чтоб один раз создать (где нить в конструкторе) всего одну метку и передовать в неё уже разные сообщения?
И ещё, если дважды нажать на кнопку во время анимации, то на этом всё и закончится.


Название: Re: Не могу решить тривиалную проблему с размерами окна :-(
Отправлено: Maksim от Май 23, 2011, 17:37
Нужно заменить Qt::SplashScreen на Qt::ToolTip.
Изменил, изменнений не дало.

К тому же пришлось править ваш код под линем, чтоб он нормально собрался..
Пишите в инклудах Qt - шные классы правильно...
работаю на винде. таких проблем нет, но учту, спасибо.

Ещё не понял, зачем создавать целый список QLabel, вместо того, чтоб один раз создать (где нить в конструкторе) всего одну метку и передовать в неё уже разные сообщения?
Список QLabel создал, чтоб легче было добратьса до всех QLabel элементов.
одной метки мне не хватит... количество строчек не ограничено на одну их может быть множество.
Можно конечно было бы и через QObjectList = children() но лень :-)

И ещё, если дважды нажать на кнопку во время анимации, то на этом всё и закончится.
Проблему с кнопкой не пойму?!?!? клацаю -> инфо строчки добавляютса,  обрыва нет.
Собрал под Qt 4.7.2


Название: Re: Не могу решить тривиалную проблему с размерами окна :-(
Отправлено: Maksim от Май 24, 2011, 00:30
проблему решил но с помощью костыля :-( пока другой возможности не вижу...

Проблема в том что функция move(QPos(x,y)) не работает сразу после вызова setVisible(true)!!!
Видать там что то ешё должно отработаться в eventLoop. Вызываю move(..) через postEvent(...) всё пашет!!! ???


Код:
{
.
.
.
    //show it
    setVisible(true);
    //post event
    QCoreApplication::postEvent(this,new QEvent((QEvent::Type)(QEvent::User+1)));   
}


void QMyInfoWidget::customEvent ( QEvent * event )
{
  if(event->type()==QEvent::User+1)
  {   
    moveWidget();     
    m_StartAnimation.start(3000);
  }
}