crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Digit QTableWidget
werwolf
  опции профиля:
сообщение 14.1.2010, 3:14
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 9
Регистрация: 19.9.2009
Пользователь №: 1112

Спасибо сказали: 0 раз(а)




Репутация:   0  


Здравствуйте, подскажите как в QTableWidget сделать ограничение на ввод только цифр (во всех ячейках)?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 14.1.2010, 6:41
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Установить делегат, в котором для виджета редактора установить соответствующий QValidator
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
werwolf
  опции профиля:
сообщение 14.1.2010, 12:41
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 9
Регистрация: 19.9.2009
Пользователь №: 1112

Спасибо сказали: 0 раз(а)




Репутация:   0  


А можно немного поподробнее как это сделать?
И появился еще один вопрос: как выделить и-ю строку(ячейку) другим цветом?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 14.1.2010, 13:24
Сообщение #4


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Цитата(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
  опции профиля:
сообщение 14.1.2010, 14:06
Сообщение #5


Новичок


Группа: Новичок
Сообщений: 9
Регистрация: 19.9.2009
Пользователь №: 1112

Спасибо сказали: 0 раз(а)




Репутация:   0  


Спасибо ! Я только начал разбирать пример SpinBoxDelegate, как появилось готовое решение, только вместо QIntValidator я использовал QDoubleValidator.
Но второй вопрос остается открытым, если брать setBackgroundRole ( QPalette::ColorRole ) , то я закрашу всю таблицу, а мне нужно только одну ячейку ( i, j ) либо все ячейки строки (это можно потом организовать в цикле, если есть возможность закрасить одну ячейку).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 14.1.2010, 14:18
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(werwolf @ 14.1.2010, 17:06) *
то я закрашу всю таблицу, а мне нужно только одну ячейку ( i, j )
дак ты в делегате проверяй какая строка/колонка в данный момент обрабатывается, у модеьных индексов можно узнать номер строки/колонки
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 14.1.2010, 14:28
Сообщение #7


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


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 )


Или же делай через делегат, что эффективнее.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.12.2024, 12:59