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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: От кого наследоваться:QWidget или QSpinBox?  (Прочитано 7183 раз)
AAXEE
Гость
« : Февраль 14, 2009, 21:35 »

Нужен обычный QSpinBox, но вместо стрелочек по умолчанию необходимы стрелочки по бокам от поля для ввода.
Отключить стрелочки по умолчанию легко. У QAbstractSpinBox есть такое свойство.

1.А вот как добавить свои стрелочки, если унаследоваться от QSpinBox?

2.Если же наследоваться от QWidget и в нем расположить 2 кнопки и QSpinBox, непонятно как сохранить интерфейс QSpinBox полностью. Если только вручную скопировать все методы QSpinBoxa в мой класс. То есть что то такое: MySpinBox::anyFunc( .... ){ this->spinBox->anyFunc( ... ) } ; (this для наглядности). Мне кажется, что делать так не правильно, и должен быть более гуманный способ.

Итак, от кого наследоваться и, если можно, примерный ход решения.
Спасибо!
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Февраль 14, 2009, 22:01 »

в первом случае стрелки (кнопки) можно расположить по краям поля редактирования, в оригинале они с одной стороны, но внутри поля.
Записан

Юра.
AAXEE
Гость
« Ответ #2 : Февраль 14, 2009, 22:24 »

Ну я это в своем первом предложении перового поста написал. Вопрос как засунуть туда кнопку?
Записан
AAXEE
Гость
« Ответ #3 : Февраль 15, 2009, 11:07 »

Странно, никто не отвечает. Это потому что слишком глупый вопрос или наоборот?
Ведь, действительно,  непонятно как расширить готовый виджет дополнительными деталями-виджетами. Получить доступ к лэйауту родительского класса невозможно.
А если выбрать другой путь и в свой виджет встраивать нужный виджет, непонятно как весь интерфейс нужного виджета сохранить.
Записан
ритт
Гость
« Ответ #4 : Февраль 15, 2009, 17:23 »

посмотри на LineEdit из SearchLineEdit в "доп.компонентах" - один из вриантов встраивания виджетов в чужеродные виджеты с сохранением интерфейса.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #5 : Февраль 15, 2009, 18:16 »

Получить доступ к лэйауту родительского класса невозможно.

Если наследоваться от QSpinBoxa, то доступ можно получить к лэйауту без проблем.

Код
C++ (Qt)
QLineEdit * QAbstractSpinBox::lineEdit () const   [protected]
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #6 : Февраль 15, 2009, 18:58 »

Можно попроьывать сделать так (ну или вроде того):

Код
C++ (Qt)
class MySpinBox : public QSpinBox
{
Q_OBJECT
 
public:
MySpinBox(QWidget* parent = 0);
 
protected:
void paintEvent(QPaintEvent* event);
 
private:
   QToolButton *m_btnUp;
   QToolButton *m_btnDown;
};

Код
C++ (Qt)
MySpinBox::MySpinBox(QWidget* parent)
  : QSpinBox(parent)
{
   setButtonSymbols(QAbstractSpinBox::NoButtons);
 
   m_btnUp = new QToolButton(this);
   m_btnUp->setText("+");
   connect(m_btnUp, SIGNAL(clicked()), this, SLOT(stepUp()));
 
   m_btnDown = new QToolButton(this);
   m_btnDown->setText("-");
   connect(m_btnDown, SIGNAL(clicked()), this, SLOT(stepDown()));
}
 
void MySpinBox::paintEvent(QPaintEvent* event)
{
   QStyleOptionSpinBox opt;
   initStyleOption(&opt);
 
   QStylePainter p(this);
 
   m_btnDown->setGeometry(opt.rect.x(), opt.rect.y(), 20, opt.rect.height());
 
   opt.rect = QRect(opt.rect.x()+20, opt.rect.y(), opt.rect.width()-40, opt.rect.height());
   opt.frame = hasFrame();
 
   m_btnUp->setGeometry(opt.rect.x() + opt.rect.width(), opt.rect.y(), 20, opt.rect.height());
 
   lineEdit()->setGeometry(opt.rect.x()+2, opt.rect.y()+2, opt.rect.width()-4, opt.rect.height()-4);
 
   p.drawComplexControl(QStyle::CC_SpinBox, opt);
}
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Dendy
Гость
« Ответ #7 : Февраль 15, 2009, 19:16 »

Как вариант - можете переопределить стиль:

Код
C++ (Qt)
QRect MyStyle::subControlRect ( ComplexControl control, const QStyleOptionComplex * option, SubControl subControl, const QWidget * widget )
{
 if ( control == CC_SpinBox )
 {
   if ( subControl == SC_SpinBoxUp )
     return QRect( ... );
   if ( subControl == SC_SpinBoxDown )
     return QRect( ... );
 }
 return ParentStyle::subControlRect( control, option, subControl, widget );
}
Записан
AAXEE
Гость
« Ответ #8 : Февраль 15, 2009, 21:29 »

Спасибо, буду осмысливать.
Константин, в вашем виджете довольно трудно разбираться( исключительно из-за моей неопытности), поэтому Ваш вариант не рассматриваю=)
Записан
AAXEE
Гость
« Ответ #9 : Февраль 15, 2009, 22:17 »

Еще я пробовал вот так:
Код:
BigSpinBox::BigSpinBox( QWidget * parent ) : QSpinBox( parent )
{
   back = new QPushButton( "<" ) ;
   layout()->addWidget( back ) ; // Здесь происходит Segmentation fault
}
Код:
class BigSpinBox : public QSpinBox
{
   Q_OBJECT
   
public :
   BigSpinBox( QWidget * parent = 0 ) ;
   
private :
   QPushButton * back ;
   QPushButton * forward ;
} ;
На выполнении сегфолтится. Интересно, почему?
Если бы не это- был бы очень простой вариант.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #10 : Февраль 15, 2009, 22:51 »

На выполнении сегфолтится. Интересно, почему?
Если бы не это- был бы очень простой вариант.

Потому что у QSpinBox нет layout'а
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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