Russian Qt Forum

Qt => Кладовая готовых решений => Тема начата: gil9red от Январь 12, 2014, 04:20



Название: Строка ввода с кнопками (line edit with buttons)
Отправлено: gil9red от Январь 12, 2014, 04:20
Простенькая реализация строки ввода с кнопками :)
Этот виджет просто хранит кнопки :)

Код
C++ (Qt)
class FadLineEdit : public QLineEdit
{
   Q_OBJECT
 
public:
   enum Side { None, Left, Right };
 
public:
   FadLineEdit( QWidget * parent = 0 );
 
   void addButton( QAbstractButton * button, Side side = Right );
   QAbstractButton * removeButton( QAbstractButton * button, Side side = Right );
 
   QList < QAbstractButton * > * leftSideButtons();
   QList < QAbstractButton * > * rightSideButtons();
 
   Side sideButton( QAbstractButton * button );
 
private:
   void refreshTextMargins();
 
protected:
   QList < QAbstractButton * > d_leftSideButtons;
   QList < QAbstractButton * > d_rightSideButtons;
 
   QHBoxLayout leftSideLayout;
   QHBoxLayout rightSideLayout;
};
 
Код
C++ (Qt)
/// PUBLIC
FadLineEdit::FadLineEdit( QWidget * parent )
   : QLineEdit( parent )
{
   QHBoxLayout * mainLayout = new QHBoxLayout();
   setLayout( mainLayout );
 
   leftSideLayout.addStretch();
   rightSideLayout.addStretch();
 
   leftSideLayout.setSpacing( 0 );
   leftSideLayout.setContentsMargins( 0, 0, 0, 0 );
 
   rightSideLayout.setSpacing( 0 );
   rightSideLayout.setContentsMargins( 0, 0, 0, 0 );
 
   mainLayout->setSpacing( 0 );
   mainLayout->setMargin( 0 );
   mainLayout->addLayout( &leftSideLayout );
   mainLayout->addLayout( &rightSideLayout );
}
 
void FadLineEdit::addButton( QAbstractButton * button, Side side )
{
   if ( side == Right )
   {
       d_rightSideButtons << button;
       rightSideLayout.insertWidget( d_rightSideButtons.size(), button, 0, Qt::AlignRight | Qt::AlignCenter );
 
   } else
   {
       d_leftSideButtons << button;
       leftSideLayout.insertWidget( 0, button, 0, Qt::AlignLeft | Qt::AlignCenter );
   }
 
   refreshTextMargins();
}
QAbstractButton * FadLineEdit::removeButton( QAbstractButton * button, Side side )
{
   if ( side == Right )
   {
       if ( d_rightSideButtons.removeOne( button ) )
       {
           rightSideLayout.removeWidget( button );
           button->setParent( 0 );
 
       } else
           return 0;
 
   } else
   {
       if ( d_rightSideButtons.removeOne( button ) )
       {
           leftSideLayout.removeWidget( button );
           button->setParent( 0 );
 
       } else
           return 0;
   }
 
   refreshTextMargins();
   return button;
}
 
QList < QAbstractButton * > * FadLineEdit::leftSideButtons()
{
   return &d_leftSideButtons;
}
QList < QAbstractButton * > * FadLineEdit::rightSideButtons()
{
   return &d_rightSideButtons;
}
 
FadLineEdit::Side FadLineEdit::sideButton( QAbstractButton * button )
{
   Side side = None;
 
   if ( d_leftSideButtons.indexOf( button ) != -1 )
       side = Left;
 
   else if ( d_rightSideButtons.indexOf( button ) != -1 )
       side = Right;
 
   return side;
}
 
/// PRIVATE
void FadLineEdit::refreshTextMargins()
{
   QMargins margins = textMargins();
 
   if ( !d_leftSideButtons.isEmpty() )
       margins.setLeft( leftSideLayout.sizeHint().width() );
 
   if ( !d_rightSideButtons.isEmpty() )
       margins.setRight( rightSideLayout.sizeHint().width() );
 
   setTextMargins( margins );
}
 


Название: Re: Строка ввода с кнопками (line edit with buttons)
Отправлено: Bepec от Январь 12, 2014, 09:18
Маленькая просьба. Если можно прикреплять картинку получившегося компонента :)


Название: Re: Строка ввода с кнопками (line edit with buttons)
Отправлено: kambala от Январь 12, 2014, 12:50
Fad — твое ФИО? его обычно капсом пишут.


Название: Re: Строка ввода с кнопками (line edit with buttons)
Отправлено: Bepec от Январь 12, 2014, 13:28
Я думаю сокращение псевдонима или же комплекс причудливых виджетов :D


Название: Re: Строка ввода с кнопками (line edit with buttons)
Отправлено: gil9red от Январь 12, 2014, 15:01
Маленькая просьба. Если можно прикреплять картинку получившегося компонента :)
ок :)

Fad — твое ФИО? его обычно капсом пишут.
После классов креатора, которые все "fancy", свой захотелось так назвать :)


Название: Re: Строка ввода с кнопками (line edit with buttons)
Отправлено: Fregloin от Июнь 02, 2015, 18:09
некрасиво смотрится кнопка с минусом.


Название: Re: Строка ввода с кнопками (line edit with buttons)
Отправлено: gil9red от Июнь 02, 2015, 19:57
некрасиво смотрится кнопка с минусом.

Дать кнопке иконку, которую хочется :)