Russian Qt Forum

Qt => Общие вопросы => Тема начата: dr_Begemot от Июль 16, 2009, 11:06



Название: Хочу сделать свое свойство Alignment
Отправлено: 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?


Название: Re: Хочу сделать свое свойство Alignment
Отправлено: break от Июль 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-и
Да действительно забыл... :)


Название: Re: Хочу сделать свое свойство Alignment
Отправлено: ритт от Июль 16, 2009, 15:48
break забыл расставить break-и :)


Название: Re: Хочу сделать свое свойство Alignment
Отправлено: BRE от Июль 16, 2009, 16:36
Так можно будет задавать выравнивания только по одной оси.
Если нужно указывать выравнивание по двум осям (AlignLeft | AlignTop), то нужно будет m_alignment определить как int и разбирать значения по-битно.


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


А можно примерчик? :)
спасибо)


Название: Re: Хочу сделать свое свойство Alignment
Отправлено: f-r-o-s-t от Июль 16, 2009, 17:37
Код
C++ (Qt)
if ( m_alignment & AlignLeft ) {
// Значит лево есть . и.т.д.
}
 


Название: Re: Хочу сделать свое свойство Alignment
Отправлено: BRE от Июль 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 )
  ...
 


Название: Re: Хочу сделать свое свойство Alignment
Отправлено: dr_Begemot от Июль 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


Название: Re: Хочу сделать свое свойство Alignment
Отправлено: ритт от Июль 17, 2009, 10:12
тема к Qt не относится. учи азы.