Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Pupil от Июнь 11, 2013, 10:34



Название: Делегат отрисовыввается только в режиме редактирования по двойному клику мыши.
Отправлено: 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;
}


Название: Re: Делегат отрисовыввается только в режиме редактирования по двойному клику мыши.
Отправлено: mutineer от Июнь 11, 2013, 10:40
Переопредели метод paint() и в нем рисуй в ячейке что хочешь


Название: Re: Делегат отрисовыввается только в режиме редактирования по двойному клику мыши.
Отправлено: Pupil от Июнь 11, 2013, 12:51
Насколько я понимаю, для paint необходимо задавать правильное изображение делегата со значением числа в нужный момент.
Как получить такое изображение? Принтскрин?


Название: Re: Делегат отрисовыввается только в режиме редактирования по двойному клику мыши.
Отправлено: mutineer от Июнь 11, 2013, 12:56
Используй QStyle::drawComplexControl и QStyle::drawControl


Название: Re: Делегат отрисовыввается только в режиме редактирования по двойному клику мыши.
Отправлено: lit-uriy от Июнь 12, 2013, 08:19
Pupil, посмотри пример "Star Delegate" (itemviews\stardelegate)
там вообще специфический делегат рисуется.


Название: Re: Делегат отрисовыввается только в режиме редактирования по двойному клику мыши.
Отправлено: lit-uriy от Июнь 12, 2013, 08:21
П.С.

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

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


Название: Re: Делегат отрисовыввается только в режиме редактирования по двойному клику мыши.
Отправлено: Pupil от Июнь 12, 2013, 12:37
Не спорю с теоремой Ферма и благодарю за сакральную геометрию! 
В таком случае вопрос поставлю по-другому: Каким образом реализовать, чтобы при открытии формы делегат сразу помещал виджет-редактор в столбец  QTableWidget?

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

опыта рисования делегата у меня нет. )


Название: Re: Делегат отрисовыввается только в режиме редактирования по двойному клику мыши.
Отправлено: Fregloin от Июнь 12, 2013, 16:10
я не пойму, вам нужно что бы все время отображались спинбоксы в столбце?
если так, то можно создавать их, и пихать в элемент через setCellWidget()


Название: Re: Делегат отрисовыввается только в режиме редактирования по двойному клику мыши.
Отправлено: Pupil от Июнь 13, 2013, 08:02
Абсолютно верно. Спинбокс должен отображаться все время )


Название: Re: Делегат отрисовыввается только в режиме редактирования по двойному клику мыши.
Отправлено: lit-uriy от Июнь 13, 2013, 19:07
Pupil почитай тему про стили в документации Qt (http://www.doc.crossplatform.ru/qt/4.6.x/style-reference.html), там описаны элементарные графические элементы из которых строятся виджеты.
И используй то о чём сказал mutineer

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


Название: Re: Делегат отрисовыввается только в режиме редактирования по двойному клику мыши.
Отправлено: Pupil от Июнь 14, 2013, 08:04
Спасибо, Друзья!
Начал изучать и пробовать )


Название: Re: Делегат отрисовыввается только в режиме редактирования по двойному клику мыши.
Отправлено: lit-uriy от Июнь 15, 2013, 15:38
Pupil возможно это для тебя:
http://www.qtforum.org/article/27466/qstyleoptioncombobox-as-paint-delegate-for-qtableview-is-blank.html

Так же на вооружение возьми:
QStyleOptionSpinBox (http://www.doc.crossplatform.ru/qt/4.6.x/qstyleoptionspinbox.html)


Название: Re: Делегат отрисовыввается только в режиме редактирования по двойному клику мыши.
Отправлено: Pupil от Июнь 15, 2013, 18:44
Спасибо!