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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QComboBox + QSpinBox = новый компонент  (Прочитано 15321 раз)
ilyagoo
Гость
« : Июнь 06, 2009, 12:08 »

Задача: создать компонент, который бы представлял собой нечто, выполняющее функции QSpinBox и QComboBox. Т.е. окошко ввода, содержащее в себе кнопки обоих этих компонентов. Нужны следующие возможности: осуществлять ввод чисел вручную, изменять числа с некоторым шагом как в QSpinBox при нажатии соответствующей кнопки или выбирать значение из выпадающего списка как в QComboBox. Как бы это осуществить?
Первое, что приходит в голову - это наследовать от них обоих, чтобы сохранить все слоты и сигналы. Вот только QSpinBox - потомок абстрактного класса, а QComboBox - QWidget'а. Второе то, как он должен отрисовываться. Вроде это происходит через QStyleOption, но этих классов получается два QStyleOptionComboBox и QStyleOptionSpinBox. Нужно и можно ли наследовать от этих двух классов или нужен QStyleOptionComplex? Кто-нибудь что-нибудь сложнее вертикальных кнопок делал, используя стили? Любое участие приветствуется. Спасибо Улыбающийся
Записан
spirit
Гость
« Ответ #1 : Июнь 06, 2009, 12:54 »

ну одновременное наследование от QSpinBox & QComboBox у тебя в любом случае не получиться,
т.к. нельзя использовать множественное наследование от QObject.

можно попробовать наследоваться чисто от QSpinBox, затем добавить QToolButton
на спинбокс и по клику по QToolButton показывать вью.
Записан
ilyagoo
Гость
« Ответ #2 : Июнь 06, 2009, 13:03 »

Цитировать
т.к. нельзя использовать множественное наследование от QObject
в этом месте поподробнее, где это в документации сказано? или это c++ не позволяет?
из этого следует, что и от двух стилей наследовать не получится?
Записан
spirit
Гость
« Ответ #3 : Июнь 06, 2009, 13:12 »

читай тут.
не понимаю причем тут стили  Непонимающий
Записан
ilyagoo
Гость
« Ответ #4 : Июнь 06, 2009, 13:38 »

Цитировать
читай тут.
угу.
компоненты отрисовываются при помощи соответствующих им стилей, которые рисуют кнопки, рамки и т.д.
например,
Код:
void QStylePainter::drawPrimitive (QStyle::PE_IndicatorSpinDown, styleOption)
рисует стрелку "вниз" для QSpinBox. А так как мне нужно, чтобы компонент имел и те и другие кнопки, придется иметь дело со стилями. Но я пока только начал на них смотреть, и любая помощь более опытных товарищей была бы кстати Подмигивающий
Записан
spirit
Гость
« Ответ #5 : Июнь 06, 2009, 13:42 »

компоненты отрисовываются при помощи соответствующих им стилей, которые рисуют кнопки, рамки и т.д.
например,
Код:
void QStylePainter::drawPrimitive (QStyle::PE_IndicatorSpinDown, styleOption)
рисует стрелку "вниз" для QSpinBox. А так как мне нужно, чтобы компонент имел и те и другие кнопки, придется иметь дело со стилями. Но я пока только начал на них смотреть, и любая помощь более опытных товарищей была бы кстати Подмигивающий
я знаю через что отрисовываются контролы, если тебе хочется все сделать ручками то вперед,
но я ж тебе предложил быстрый вариант.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #6 : Июнь 06, 2009, 13:44 »

Про наследование есть и в документации: qthelp://com.trolltech.qt.442/qdoc/moc.html раздел "Multiple Inheritance Requires QObject to Be First"
Записан

Юра.
ilyagoo
Гость
« Ответ #7 : Июнь 06, 2009, 13:48 »

ручками хочется сделать не из-за того, что я упертый и мне лень к QLineEdit приклеить несколько кнопок, а из-за желания не отступать от концепции Qt. и знать-то я знаю, но вот опыта использования хватило только на вертикальную кнопку, да и то, используя чужой код Смеющийся
Записан
ilyagoo
Гость
« Ответ #8 : Июнь 06, 2009, 13:51 »

Про наследование есть и в документации: qthelp://com.trolltech.qt.442/qdoc/moc.html раздел "Multiple Inheritance Requires QObject to Be First"

Also, be sure that only the first inherited class is a QObject. так все-таки можно?
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #9 : Июнь 06, 2009, 14:11 »

QObject и его наследники, разумеется. После примера идёт ещё одно предложение, о том, что виртуальное наследование для QObject не поддерживается.
Записан

Юра.
ilyagoo
Гость
« Ответ #10 : Июнь 06, 2009, 14:40 »

короче говоря, наследовать от двух потомков QObject можно только при виртуальном наследовании, которое не поддерживается, то есть нельзя Улыбающийся
со стилями получается та же история...
выходит, что нужно наследовать QStyleOptionComplex? а как при этом управлять новыми контролами? это абстрактный вопрос, т.к. я пока только рассуждаю. было бы неплохо посмотреть на код чего-нибудь похожего. кстати, а для чего нужны классы, оканчивающиеся ...Private? мне придется делать такой же?
Записан
spirit
Гость
« Ответ #11 : Июнь 06, 2009, 15:10 »

кстати, а для чего нужны классы, оканчивающиеся ...Private? мне придется делать такой же?
почитай про pimpl.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #12 : Июнь 06, 2009, 15:19 »

ilyagoo, посмотри статейку свежую:
http://labs.trolltech.com/blogs/2009/06/05/cross-platform-code-and-styles/

Там и исходник готовый есть.
Записан

Юра.
ilyagoo
Гость
« Ответ #13 : Июнь 06, 2009, 16:23 »

Цитировать
почитай про pimpl
посмотрю, спасибо.

Цитировать
интересно, но совсем не о том. это про QStyle, а мне нужен QStyleOption.
Записан
ilyagoo
Гость
« Ответ #14 : Июнь 08, 2009, 10:57 »

начало приблизительно такое:

spincombobox.h

Код:
#ifndef SPINCOMBOBOX_H
#define SPINCOMBOBOX_H

#include <QSpinBox>
#include <QStyleOption>

class TStyleOptionSpinComboBox : public QStyleOptionSpinBox
{

public:

   enum { SO_SpinComboBox = SO_ComplexCustomBase + 1 };

   enum StyleOptionType { Type = SO_SpinComboBox };
   enum StyleOptionVersion { Version = 1 };

   QAbstractSpinBox::ButtonSymbols buttonSymbols;
   QAbstractSpinBox::StepEnabled stepEnabled;

   bool frame;
   bool editable;
   QRect popupRect;
   QString currentText;
   QIcon currentIcon;
   QSize iconSize;

   TStyleOptionSpinComboBox();
};

class TSpinComboBox : public QSpinBox
{
   Q_OBJECT

public:
   TSpinComboBox(QWidget *parent = 0);
   ~TSpinComboBox();


protected:

   void paintEvent(QPaintEvent *event);

private:

};

#endif // SPINCOMBOBOX_H

spincombobox.cpp

Код:
#include "spincombobox.h"
#include <QPainter>
#include <QStylePainter>
#include <QtDebug>

TStyleOptionSpinComboBox::TStyleOptionSpinComboBox()
:  /*QStyleOptionComplex(Version, SO_SpinComboBox),*/ buttonSymbols(QAbstractSpinBox::UpDownArrows),
   stepEnabled(QAbstractSpinBox::StepNone), frame(true), editable(false)
{
   activeSubControls = QStyle::SC_SpinBoxDown | QStyle::SC_ComboBoxArrow; // нужно ли?
}

TSpinComboBox::TSpinComboBox(QWidget *parent)
   : QSpinBox(parent)
{

}

TSpinComboBox::~TSpinComboBox()
{

}

void TSpinComboBox::paintEvent(QPaintEvent *event)
{
   TStyleOptionSpinComboBox option;
   option.initFrom(this);                                        // инициализация стиля SpinBox

   QStylePainter spainter(this);
   spainter.drawComplexControl(QStyle::CC_SpinBox, option);
   spainter.drawComplexControl(QStyle::CC_ComboBox, option);
}

чего здесь не хватает? возможно это инициализация части ComboBox? начало-то хоть адекватное?
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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