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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QT(452):QSpinBox делегат  (Прочитано 6013 раз)
rapaks
Гость
« : Июль 05, 2010, 10:31 »

Вопрос 1: Как изменить параметры QSpinBox делегата после его создания?
(Т.е. хотелось бы обратиться к QSpinBox делегату находящемуся в определенной ячейке
и изменить его параметры, кпримеру задать новый мин и макс, но как такое сделать ? )

Вопрос 2: В чем причина, если не устанавливается текущее значение для QSpinBox делегата?
(Т.е. в начале при отображении QTableWidget не отображается текущее значение в ячейках (они пусты)
в которых заданы QSpinBox делегаты, но потом при активации ячейки отображается все нормально, но и тут проблема устанвавливается дефолтное значение, вместо моего четко заднного текущего занчения (см. createEditor))


Вот внутренности QSpinBox делегата:

Код:
QWidget *QDelegateSpinBoxInt::createEditor(QWidget* parent,const QStyleOptionViewItem& option,const QModelIndex& index)const 
{
    QSpinBox* lsbi=new QSpinBox(parent);
    lsbi->setMinimum(-77);          //устанавливется отл.
    lsbi->setMaximum(99);           //устанавливется отл.
    lsbi->setValue(55);         //тут все ставится отл, а при отображении остается всегда 0 / Min, если Min>0 / Max, если Max<0
    lsbi->setSingleStep(1);         //устанавливется отл.
    lsbi->installEventFilter(const_cast<QDelegateSpinBoxInt*>(this));
    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);
}
« Последнее редактирование: Июль 05, 2010, 12:21 от rapaks » Записан
Kolobok
Гость
« Ответ #1 : Июль 05, 2010, 11:54 »

Ты создаешь QSpinBox, а потом приводишь его к QLineEdit?
Записан
rapaks
Гость
« Ответ #2 : Июль 05, 2010, 12:26 »

Ты создаешь QSpinBox, а потом приводишь его к QLineEdit?
Ошибся, не то скопировал сюда, у меня в таблице есть и QSpinBox и QLineEdit, но речь щас о QSpinBox. В общем заменил код выше.


В QTableView нашел
Код:
void QAbstractItemView::openPersistentEditor ( const QModelIndex & index )
void QAbstractItemView::closePersistentEditor ( const QModelIndex & index )
void edit ( const QModelIndex & index )
для QLineEdit функции openPersistentEditor и closePersistentEditor работают отл, а вот для QSpinBox нифига не проходит сигнал.
Функция edit - пашет и для QSpinBox и для QLineEdit, но как потом снять это редактирование, вроде есть closeEditor ( QWidget *, QAbstractItemDelegate::EndEditHint ) , но он ведь требует виджет - как быть?

Смесь edit + closePersistentEditor - не помогает.

Делегаты создаю сразу для всей нужной колонки, может стоит создавать отдельно для каждой ячейки - как это сделать я не знаю, может подскажите?


В общем вопросы так и не решены.
Записан
Kolobok
Гость
« Ответ #3 : Июль 05, 2010, 17:28 »

Ты пишешь делегата, только чтобы min и max у QSpinBox установить?
Записан
rapaks
Гость
« Ответ #4 : Июль 06, 2010, 08:15 »

Ты пишешь делегата, только чтобы min и max у QSpinBox установить?

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

При чем есть 2 варианта:
1) Нужно изменить диапазон для  всех QSpinBox делегатов в столбце
2) Нужно изменить диапазон только для определенной ячейки        - особо важно!

Ну что, неужели никто не может ничего подсказать толкового ? Никто с таким не сталкивался ?


Вот что хотелось бы получить и что есть сейчас, но увы не пашет из-за const которые я никак не могу обойти

Код:
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)
{
    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;
}

но увы оказывается, что эти переменные const
Код:
        QSpinBox*               dsbi;
        int                 dsbiMin;
        int                 dsbiMax;
        int                 dsbiStep;
        int                 dsbiValue;
Как бы это обойти?


Прикрепил простенькую программку на которой тестирую новые способы решения этих и других задач
« Последнее редактирование: Июль 06, 2010, 09:00 от rapaks » Записан
nixman05
Гость
« Ответ #5 : Июль 07, 2010, 12:06 »

Посмотри в сторону Qt Property Browser
http://qt.nokia.com/products/appdev/add-on-products/catalog/4/Widgets/qtpropertybrowser/

Обрати внимание на QtDoubleSpinBoxFactory.
Записан
rapaks
Гость
« Ответ #6 : Июль 07, 2010, 13:01 »

Посмотри в сторону Qt Property Browser
http://qt.nokia.com/products/appdev/add-on-products/catalog/4/Widgets/qtpropertybrowser/

Обрати внимание на QtDoubleSpinBoxFactory.


Спасибо за ссылочку, посмотрю/поизучаю на досуге, но на 1 взгляд это не то чего я хочу получить.
Если вы с этим кождом разобрались, тогда подскажиет еще, пожалуйста, на какие функции/методы стоит особо обратить внимание и как их применить для решения моих задач.
Записан
MrLink
Гость
« Ответ #7 : Июль 12, 2010, 10:43 »

У меня похожая ситуация, но у меня строк мало и для каждой сделал (пока) свой объект делегат (они причём разные: combobox, spinbox). Соответственно каждому могу менять диапазон. Но ничто не мешает объеденить их в вектор.

Присмотрелся поподробнее - у меня точно так же написано.
« Последнее редактирование: Июль 12, 2010, 13:59 от MrLink » Записан
rapaks
Гость
« Ответ #8 : Июль 14, 2010, 08:49 »

Ну объединение в некоторый массив - это самое простое и очевидное решение. Но в таком массиве нужно помимо указателя на этот элемент хранить и "координаты" ячейки в которой он находится. Этот вариант у меня является сейчас основным и рабочим.

Но хочется чегото более элегантного нежели выделять дополнительную память под массив.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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