Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Digit QTableWidget
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Модель/Представление
werwolf
Здравствуйте, подскажите как в QTableWidget сделать ограничение на ввод только цифр (во всех ячейках)?
Litkevich Yuriy
Установить делегат, в котором для виджета редактора установить соответствующий QValidator
werwolf
А можно немного поподробнее как это сделать?
И появился еще один вопрос: как выделить и-ю строку(ячейку) другим цветом?
igor_bogomolov
Цитата(werwolf @ 14.1.2010, 12:41) *
А можно немного поподробнее как это сделать?
Класс делегата можно написать примерно так
.h
class LineEditDelegate : public QItemDelegate
{
    Q_OBJECT
public:
   LineEditDelegate(QObject* parent = 0);

    QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const;

    void setEditorData(QWidget* editor, const QModelIndex& index) const;
    void setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const;

    void updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem& option, const QModelIndex& index) const;
};
.cpp

LineEditDelegate::LineEditDelegate(QObject* parent)
    : QItemDelegate(parent)
{
}

QWidget* LineEditDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem& /*option*/, const QModelIndex& index ) const
{
    Q_UNUSED(index);

    QLineEdit* lineEdit = new QLineEdit(parent);
    lineEdit->setValidator(new QIntValidator(0,100,lineEdit));
    return lineEdit;
}

void LineEditDelegate::setEditorData(QWidget* editor, const QModelIndex& index) const
{
    QLineEdit* lineEdit = qobject_cast<QLineEdit*>(editor);
    if (!lineEdit) return;

    lineEdit->setText(index.data(Qt::EditRole).toString());
}

void LineEditDelegate::setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const
{
    QLineEdit* lineEdit = qobject_cast<QLineEdit*>(editor);
    if (!lineEdit) return;

    model->setData(index, lineEdit->text());
}

void LineEditDelegate::updateEditorGeometry(QWidget* editor,
    const QStyleOptionViewItem& option, const QModelIndex& /* index */) const
{
    editor->setGeometry(option.rect);
}
Цитата(werwolf @ 14.1.2010, 12:41) *
появился еще один вопрос: как выделить и-ю строку(ячейку) другим цветом?
void QTableWidgetItem::setBackground ( const QBrush & brush )
Или же опять таки через делегат, перекрыв в нем paint


werwolf
Спасибо ! Я только начал разбирать пример SpinBoxDelegate, как появилось готовое решение, только вместо QIntValidator я использовал QDoubleValidator.
Но второй вопрос остается открытым, если брать setBackgroundRole ( QPalette::ColorRole ) , то я закрашу всю таблицу, а мне нужно только одну ячейку ( i, j ) либо все ячейки строки (это можно потом организовать в цикле, если есть возможность закрасить одну ячейку).
Litkevich Yuriy
Цитата(werwolf @ 14.1.2010, 17:06) *
то я закрашу всю таблицу, а мне нужно только одну ячейку ( i, j )
дак ты в делегате проверяй какая строка/колонка в данный момент обрабатывается, у модеьных индексов можно узнать номер строки/колонки
igor_bogomolov
setBackgroundRole задает цвет для всего виджета.

Используй следующие мотоды чтобы установить/получения item таблицы:
void QTableWidget::setItem ( int row, int column, QTableWidgetItem * item )
QTableWidgetItem * QTableWidget::item ( int row, int column ) const

для этих item и задавай цвет используя
Цитата
void QTableWidgetItem::setBackground ( const QBrush & brush )


Или же делай через делегат, что эффективнее.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.