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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Хочу сделать свое свойство Alignment  (Прочитано 5140 раз)
dr_Begemot
Гость
« : Июль 16, 2009, 11:06 »

Хочу сделать свое свойство Alignment, но плодить enum-ы не хочется, а ъхочется заюзать Qt::Alignment вопрос в том как с ним работать.

Задача в следующем, есть некоторая точка QPoint pos, объект прямоугольник с известными height и width может располагаться в любых позициях от этой точки, как то: центр прямоугольника совпадает с pos, центр по ox сопадает с pos, а по oy находится слева ну итд.

Описываю сеттеры и геттеры переменной Qt::Alignment m_alignment:
Код:
void setAlignment(Qt::Alignment alignment){
  m_alignment = alignment;
}
Qt::Alignment alignment() const{
  return m_alignment;
}

теперь в ф-ии drawRect() надо нарисовать прямоугольник:

Код:
void drawRect(int height, int width){
  //...
}

Тут же есть следующие позиции: По горизонтали - центр, слева, справа и по вертикали, центр, снизу, сверху.
Вопрос собственно в том, как из m_alignment вытащить данные сведения и как правильно устанавливать значения при вызове setAlignment?
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #1 : Июль 16, 2009, 13:14 »

в упор не пойму в чем ворос - вот в методе paint и проверять

Код
C++ (Qt)
paintEvent(..........)
{
.......
 
switch ( m_align )
{
case (Qt::AlignLeft):
{
  x =
  y =
    break;
};
case (Qt::AlignTop):
{
  x =
  y =
    brek;
};
};

.......
}

в смысле в вашем DrawRect или в вашем собственном setAlignment

Цитировать
break забыл расставить break-и
Да действительно забыл... Улыбающийся
« Последнее редактирование: Июль 16, 2009, 16:54 от break » Записан
ритт
Гость
« Ответ #2 : Июль 16, 2009, 15:48 »

break забыл расставить break-и Улыбающийся
Записан
BRE
Гость
« Ответ #3 : Июль 16, 2009, 16:36 »

Так можно будет задавать выравнивания только по одной оси.
Если нужно указывать выравнивание по двум осям (AlignLeft | AlignTop), то нужно будет m_alignment определить как int и разбирать значения по-битно.
Записан
dr_Begemot
Гость
« Ответ #4 : Июль 16, 2009, 17:14 »

Так можно будет задавать выравнивания только по одной оси.
Если нужно указывать выравнивание по двум осям (AlignLeft | AlignTop), то нужно будет m_alignment определить как int и разбирать значения по-битно.


А можно примерчик? Улыбающийся
спасибо)
Записан
f-r-o-s-t
Гость
« Ответ #5 : Июль 16, 2009, 17:37 »

Код
C++ (Qt)
if ( m_alignment & AlignLeft ) {
// Значит лево есть . и.т.д.
}
 
Записан
BRE
Гость
« Ответ #6 : Июль 16, 2009, 17:42 »

А можно примерчик? Улыбающийся
спасибо)

Код
C++ (Qt)
class XXX
{
   void setAlignment( int align );
   int   alignment() const;
 
private:
   int m_alignment;
};
 
 
void XXX::drawRect(...)
{
   int hAlign = m_alignment & Qt::AlignHorizontal_Mask;
   int vAlign = m_alignment & Qt::AlignVertical_Mask;
 
   switch( hAlign )
   {
       case Qt::AlignLeft: ... break;
       case Qt::AlignRight: ... break;
   }
 
   switch( vAlign )
   {
   }
 
}
 

Но нужно помнить, что если клиент укажет по ошибке два значения выравнивания (AlignLeft|AlignRight), то не отработает не один.

Или можно выделять значение бита для каждого значения и проверять их:
Код
C++ (Qt)
if( m_alignment & Qt::AlignLeft )
   ...
else if( m_alignment & Qt::AlignRight )
  ...
 
Записан
dr_Begemot
Гость
« Ответ #7 : Июль 17, 2009, 09:47 »

А можно примерчик? Улыбающийся
спасибо)

Код
C++ (Qt)
class XXX
{
   void setAlignment( int align );
   int   alignment() const;
 
private:
   int m_alignment;
};
 
 
void XXX::drawRect(...)
{
   int hAlign = m_alignment & Qt::AlignHorizontal_Mask;
   int vAlign = m_alignment & Qt::AlignVertical_Mask;
 
   switch( hAlign )
   {
       case Qt::AlignLeft: ... break;
       case Qt::AlignRight: ... break;
   }
 
   switch( vAlign )
   {
   }
 
}
 

Но нужно помнить, что если клиент укажет по ошибке два значения выравнивания (AlignLeft|AlignRight), то не отработает не один.

Или можно выделять значение бита для каждого значения и проверять их:
Код
C++ (Qt)
if( m_alignment & Qt::AlignLeft )
   ...
else if( m_alignment & Qt::AlignRight )
  ...
 


Можно поподробней про проверку... не совсем понял. Если пользователь введет (AlignLeft|AlignRight|AlignTop), то что будет в hAlign, а что в vAlign?

upd: В vAlign я так понимаю будет AlignTop
« Последнее редактирование: Июль 17, 2009, 10:12 от dr_Begemot » Записан
ритт
Гость
« Ответ #8 : Июль 17, 2009, 10:12 »

тема к Qt не относится. учи азы.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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