Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > фильтр ввода в QTableWidgetItem


Автор: hawk3500 12.1.2012, 14:29
Здравствуйте.
Возникла ситуация в которой мне надо отлавливать вводимые с клавиатуры данные в любую из ячеек таблицы QTableWidget.
Никакой ни фильтр не установить ни сигнал соединить.
Если сказал не ясно то опишу как пример:
есть QTableWidget и нужно использовать его как основу для HEX редактора, т.е. количество вводимых символов в ячейку не превышает двух и они соответствуют HEX коду.
Заранее благодарен.
С уважением,
HAWK3500.

Автор: spyswamp 12.1.2012, 15:19
Обрати свой взор в сторону делегатов (в документации искать QItemDelegate и т.п.). Создавай там любой editor и ограничивай его как хочешь.

Автор: _GRIN_ 12.1.2012, 16:15
и в createEditor() можно возвращать просто  QLineEdit - ну а фильтр ему через QValidator задать =)

Автор: hawk3500 12.1.2012, 16:33
т.е. если я Вас правильно понял то Вы предлагаете в каждую ячейку помещать какойто другой ,отличный от того что по умолчанию виджет(например QLineEdit)?

Автор: spyswamp 12.1.2012, 20:49
Ага. Это делается по уму именно так.

Автор: _GRIN_ 13.1.2012, 07:44
hawk3500, не совсем верно - ты задаёшь делегат 1 раз для всего вью (QTableWidget - наследник от QTableView - а он наследник от QAbstractItemView) - а уж делегат для каждого айтема при соответствующем действии (например двойной клик по ячейке) создаст редактор (будет вызвана функция createEditor() - ты её переопределяешь в своей имплементации делегата - и возвращаешь например QLineEdit с соответствующим QValidator).

Автор: hawk3500 13.1.2012, 07:53
_GRIN_  спасибо.
Сегодня попробую.

Автор: hawk3500 13.1.2012, 09:59
Я сделал вот так:
Код

#include <QItemDelegate>
#include <QtGui/QMainWindow>
#include <QtCore>
#include <QtGui>
class CChoicePathDelegate : public QItemDelegate
{
     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;
    private slots:
        void TesttextEdited(const QString &UU);
};



QWidget * CChoicePathDelegate::createEditor(QWidget *parent,
                       const QStyleOptionViewItem & /* option */,
                       const QModelIndex &index) const
{
    
    QLineEdit *LineEd = new QLineEdit(parent);
    LineEd->setInputMask("HHHH");
    bool K=connect(LineEd, SIGNAL(textEdited(const QString)), this, SLOT(TesttextEdited(const QString)));
    return LineEd;
    
}
void CChoicePathDelegate::setEditorData(QWidget *editor,
                   const QModelIndex &index) const
{
    QLineEdit *LineEd = qobject_cast<QLineEdit *>(editor);
    if (!LineEd)return;
}
void CChoicePathDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
                  const QModelIndex &index) const
{
    QLineEdit *LineEd = qobject_cast<QLineEdit *>(editor);
    if (!LineEd)return;
    model->setData(index,LineEd->text());
    return;
}
void CChoicePathDelegate::TesttextEdited(const QString &UU)
{
    return;
}

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

Автор: hawk3500 13.1.2012, 11:02
Я так понял что createEditor вызывается каждый раз при активации поля....но если в этом поле уже были данные......как их отобразить в новообразовавшийся QLineEdit?

Добавлено через 10 минут и 6 секунд
С последним разобрался....а вот как из делегата обращаться к  QTableWidget так и не понял smile 

Автор: _GRIN_ 13.1.2012, 13:55
Цитата(hawk3500 @  13.1.2012,  09:02 Найти цитируемый пост)
а вот как из делегата обращаться к  QTableWidget так и не понял


ну проще всего явно передавать делегату указатель на вью (в конструкторе, или в отдельной функции),
т.к. при задании делегат для вью - вью не становится parent-ом делегата
Код

 QAbstractItemView does not take ownership of delegate.

Так что кастить parent() к вью - не стоит (даже если на самом деле ты в конкнструкторе делега вью указал как parent).
А другого апи для данных целей кьют не предоставляет - думаю не без причины =)

Добавлено через 5 минут и 12 секунд
Кстати, рискну предположить, что тебе не нужен указатель на QTableWidget - я так понимаю, что ты хочешь в таблице данные изменить.
Если я прав, то для этого используй QAbstractItemDelegate::setModelData().

P.S.
Вообще лучше сразу смотреть в сторону model+view - а не в сторону виджетов - говорю по собственному опыту.

Автор: hawk3500 13.1.2012, 14:14
Спасибо.
Сделал как Вы рекомендовали.
Всё замечательно работает)))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)