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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Не могу решить тривиалную проблему с размерами окна :-(  (Прочитано 3379 раз)
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
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Май 23, 2011, 12:58 »

Код
C++ (Qt)
QWidget::adjustSize();
QWidget::size();
или
QWidget::frameSize();
 
« Последнее редактирование: Май 23, 2011, 13:01 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
Maksim
Гость
« Ответ #2 : Май 23, 2011, 13:26 »

спасибо! size() уже луче но ещё не совсем то что надо... пробую frameSize()...
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #3 : Май 23, 2011, 15:31 »

спасибо! size() уже луче но ещё не совсем то что надо... пробую frameSize()...
Перед тем как вызывать size() нужно сделать adjustSize(), как написал GreatSnake.
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Maksim
Гость
« Ответ #4 : Май 23, 2011, 16:13 »

Собрал неболшой пример. Думаю так будет легче для всех.  Надеюс кто нить найдёт мою ошибку....
СПАСИБО!!!
Записан
Maksim
Гость
« Ответ #5 : Май 23, 2011, 17:15 »

Есть идеи?
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #6 : Май 23, 2011, 17:16 »

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

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Maksim
Гость
« Ответ #7 : Май 23, 2011, 17:37 »

Нужно заменить Qt::SplashScreen на Qt::ToolTip.
Изменил, изменнений не дало.

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

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

И ещё, если дважды нажать на кнопку во время анимации, то на этом всё и закончится.
Проблему с кнопкой не пойму?!?!? клацаю -> инфо строчки добавляютса,  обрыва нет.
Собрал под Qt 4.7.2
Записан
Maksim
Гость
« Ответ #8 : Май 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);
  }
}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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