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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Делегат отрисовыввается только в режиме редактирования по двойному клику мыши.  (Прочитано 6626 раз)
Pupil
Гость
« : Июнь 11, 2013, 10:34 »

Добрый день!

При присоединении делегата, наследующего QSpinBox, в QTableWidget делегает не появляется сразу в ячейках заданного столбца, а появляется только при двойном клике мыши по данной ячейке.
Возможно, это лишнее эстетство, но можно ли, что делегат появлялся в ячейках сразу? Пытался решить вопрос через конструктор, но не получилось.

Код:
class TableDelegateInt : public QItemDelegate
{
    Q_OBJECT
public:
    TableDelegateInt(int value=0,int min=-2147483647,int max=2147483647,int step=1,QObject* parent=0);
    QWidget* createEditor(QWidget* parent,const QStyleOptionViewItem& option,const QModelIndex& index) const;
    void setEditorData(QWidget* wgt,const QModelIndex& index) const;
    void setModelData(QWidget* wgt,QAbstractItemModel* model,const QModelIndex& index) const;
    void updateEditorGeometry(QWidget* wgt,const QStyleOptionViewItem& option,const QModelIndex& index) const;
public slots:
    int  SetMin(int value);
    int  SetMax(int value);
private:
    QSpinBox* dsbi;
    int dsbiMin;
    int dsbiMax;
    int dsbiStep;
    int dsbiValue;
};

TableDelegateInt::TableDelegateInt(int value,int min,int max,int step, QObject* parent):QItemDelegate(parent)
    {
     // QSpinBox* lsbi=new QSpinBox(parent);
        dsbiValue   =value;
        dsbiMin     =min;
        dsbiMax     =max;
        dsbiStep    =step;
    }
    QWidget *TableDelegateInt::createEditor(QWidget* parent,const QStyleOptionViewItem& option,const QModelIndex& index)const
    {
        QSpinBox* lsbi=new QSpinBox(parent);
        lsbi->setMinimum(dsbiMin);
        lsbi->setMaximum(dsbiMax);
        lsbi->setSingleStep(dsbiStep);
        lsbi->setValue(dsbiValue);
        return lsbi;
    }
    void TableDelegateInt::setEditorData(QWidget* wgt,const QModelIndex& index)const
    {
        int value=index.model()->data(index,Qt::EditRole).toInt();
        QSpinBox* lsbi=static_cast<QSpinBox*>(wgt);
        lsbi->setValue(value);
    }
    void TableDelegateInt::setModelData(QWidget* wgt,QAbstractItemModel* model,const QModelIndex& index)const
    {
        QSpinBox* lsbi=static_cast<QSpinBox*>(wgt);
        lsbi->interpretText();
        int value=lsbi->value();
        model->setData(index,value,Qt::EditRole);
    }
    void TableDelegateInt::updateEditorGeometry(QWidget* wgt,const QStyleOptionViewItem& option,const QModelIndex& index)const
    {
        wgt->setGeometry(option.rect);
    }


int TableDelegateInt::SetMin(int value)
{
dsbiMin=value;
return dsbiMin;
}
int TableDelegateInt::SetMax(int value)
{
dsbiMax=value;
return dsbiMax;
}
Записан
mutineer
Гость
« Ответ #1 : Июнь 11, 2013, 10:40 »

Переопредели метод paint() и в нем рисуй в ячейке что хочешь
Записан
Pupil
Гость
« Ответ #2 : Июнь 11, 2013, 12:51 »

Насколько я понимаю, для paint необходимо задавать правильное изображение делегата со значением числа в нужный момент.
Как получить такое изображение? Принтскрин?
Записан
mutineer
Гость
« Ответ #3 : Июнь 11, 2013, 12:56 »

Используй QStyle::drawComplexControl и QStyle::drawControl
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


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

Pupil, посмотри пример "Star Delegate" (itemviews\stardelegate)
там вообще специфический делегат рисуется.
Записан

Юра.
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #5 : Июнь 12, 2013, 08:21 »

П.С.

При присоединении делегата, наследующего QSpinBox, в QTableWidget делегает не появляется сразу в ячейках заданного столбца, а появляется только при двойном клике мыши по данной ячейке.

ты не верно представляешь работу.
Делегат появляется сразу (именно он рисует ячейку в представлении). А по двойному щелчку по ячейке делегат помещает на её место виджет-редактор.
Записан

Юра.
Pupil
Гость
« Ответ #6 : Июнь 12, 2013, 12:37 »

Не спорю с теоремой Ферма и благодарю за сакральную геометрию! 
В таком случае вопрос поставлю по-другому: Каким образом реализовать, чтобы при открытии формы делегат сразу помещал виджет-редактор в столбец  QTableWidget?

Я нашел метод QTableWidget - он работает, но требуется его везде таскать за собой, что в 21 веке - нелепо. )
Код:
void QTableWidget::openPersistentEditor ( QTableWidgetItem * item )

опыта рисования делегата у меня нет. )
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #7 : Июнь 12, 2013, 16:10 »

я не пойму, вам нужно что бы все время отображались спинбоксы в столбце?
если так, то можно создавать их, и пихать в элемент через setCellWidget()
Записан
Pupil
Гость
« Ответ #8 : Июнь 13, 2013, 08:02 »

Абсолютно верно. Спинбокс должен отображаться все время )
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #9 : Июнь 13, 2013, 19:07 »

Pupil почитай тему про стили в документации Qt, там описаны элементарные графические элементы из которых строятся виджеты.
И используй то о чём сказал mutineer

П.С.
на странице по ссылке даже тот-же SpinBox упоминается
Записан

Юра.
Pupil
Гость
« Ответ #10 : Июнь 14, 2013, 08:04 »

Спасибо, Друзья!
Начал изучать и пробовать )
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #11 : Июнь 15, 2013, 15:38 »

Pupil возможно это для тебя:
http://www.qtforum.org/article/27466/qstyleoptioncombobox-as-paint-delegate-for-qtableview-is-blank.html

Так же на вооружение возьми:
QStyleOptionSpinBox
« Последнее редактирование: Июнь 15, 2013, 15:43 от lit-uriy » Записан

Юра.
Pupil
Гость
« Ответ #12 : Июнь 15, 2013, 18:44 »

Спасибо!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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