Название: Проблемма с фильтром событий QT3.3.8
Отправлено: Примерный ученик от Июль 21, 2008, 11:41
В таблице есть столбец Combobox myTQComboTableItem* paItem; paItem= new myTQComboTableItem(aTable,cEa,FALSE); paItem->setEditable(TRUE); paItem->setCurrentItem(0); paItem->installEventFilter(new KeyFilter(paItem)); fActivePusk->aTable->setItem(j,i,paItem);
Создан фильтр bool KeyFilter::eventFilter(QObject* pObj,QEvent* pe) { if ( pe->type() == QEvent::KeyPress ) { QKeyEvent *k = (QKeyEvent *)pe; int i=k->key(); if ((k->key()==Key_Enter) || (k->key()==Key_Return)) { QMessageBox::information( 0, "Попали"); return TRUE; } else return FALSE; } else return FALSE; }
Цель - после завершения редактирования - оставить указатель на той же ячейке... Однако - фильтр управления не получает... Где я неправ? // h файл class myTQComboTableItem : public QComboTableItem, public QObject { public: myTQComboTableItem(QTable * table, const QStringList & list, bool editable); };
class KeyFilter : public QObject { Q_OBJECT protected: virtual bool eventFilter(QObject*,QEvent*); public: KeyFilter(QObject* pObj=0, const char* pszName=0); };
// реализация myTQComboTableItem::myTQComboTableItem( QTable * table, const QStringList & list, bool editable = FALSE ) :QComboTableItem ( table, list, editable) { }
Название: Re: Проблемма с фильтром событий QT3.3.8
Отправлено: BaltikS от Июль 21, 2008, 14:33
Приведённого кода явно недостаточно! :-\
Название: Re: Проблемма с фильтром событий QT3.3.8
Отправлено: Примерный ученик от Июль 21, 2008, 20:41
В столбцах таблицы, где используются поля с TValidatorTableItem, все прекрасно срабатывает. QComboTableItem прямо использовать не получается, т.к. ему метод installEventFilter не доступен. Пришлось его переопределить, добавив в предки QObject
Название: Re: Проблемма с фильтром событий QT3.3.8
Отправлено: Примерный ученик от Июль 25, 2008, 17:29
Если вешаю фильтр на QLineEdit, то он замечательно работает.... Неужели никто не подскажет куда копать?
Название: Re: Проблемма с фильтром событий QT3.3.8
Отправлено: pastor от Июль 25, 2008, 17:48
В столбцах таблицы, где используются поля с TValidatorTableItem, все прекрасно срабатывает.
А что это за класс TValidatorTableItem? Можно глянуть его код? QComboTableItem прямо использовать не получается, т.к. ему метод installEventFilter не доступен. Пришлось его переопределить, добавив в предки QObject
Такой метод решения точно работать небудет. Как вариант можно наследовать от QTableItem и создать самому к аналог QComboTableItem, и уже в этом классе устанавливать фильтр. По той меие смотри кдасс QTableItem и метод createEditor (в ассистанте есть пример). ЗЫ: Нужно только помнить о времени жизни эдитора. Непомню как в Qt3, но в Qt4 эдитор уничтожаеться после завершения редавтирования. Qt3 может быть он просто хайдиться, а может быть и удуляеться также. Это стоит проверить вам.
Название: Re: Проблемма с фильтром событий QT3.3.8
Отправлено: Примерный ученик от Июль 25, 2008, 17:53
В столбцах таблицы, где используются поля с TValidatorTableItem, все прекрасно срабатывает.
А что это за класс TValidatorTableItem? Можно глянуть его код? // описание class TValidatorTableItem : public QTableItem , public QObject { public: TValidatorTableItem(QTable* table, EditType et ); TValidatorTableItem(QTable* table, EditType et, QValidator* pValidator); TValidatorTableItem(QTable* table, EditType et, const QString& text ); TValidatorTableItem(QTable* table, EditType et, const QString& text, QValidator* pValidator); virtual ~TValidatorTableItem();
virtual QWidget * createEditor() const; QValidator* validator()const { return m_pValidator; }; void setValidator(QValidator* pValidator);
private: QValidator* m_pValidator; QLineEdit* m_pEdit; };
// реализация TValidatorTableItem::TValidatorTableItem(QTable* table, EditType et) : QTableItem(table, et), m_pValidator(NULL), m_pEdit(NULL) { }
TValidatorTableItem::TValidatorTableItem(QTable* table, EditType et, QValidator* pValidator) : QTableItem(table, et), m_pValidator(NULL), m_pEdit(NULL) { setValidator(pValidator); }
TValidatorTableItem::TValidatorTableItem(QTable* table, EditType et, const QString& text) : QTableItem(table, et, text), m_pValidator(NULL), m_pEdit(NULL) { }
TValidatorTableItem::TValidatorTableItem(QTable* table, EditType et, const QString& text, QValidator* pValidator) : QTableItem(table, et, text), m_pValidator(NULL), m_pEdit(NULL) { setValidator(pValidator); }
void TValidatorTableItem::setValidator(QValidator* pValidator) { if (NULL != m_pValidator) delete m_pValidator; m_pValidator = pValidator; if (NULL != m_pEdit) m_pEdit->setValidator(m_pValidator); QString content = text(); if (NULL != m_pValidator) { int iPos = 0; if (QValidator::Invalid == m_pValidator->validate(content, iPos)) setText(""); } }
QWidget* TValidatorTableItem::createEditor() const { TValidatorTableItem* pItem = (TValidatorTableItem*)(this); pItem->m_pEdit = (QLineEdit*)(QTableItem::createEditor()); if (NULL != m_pEdit) { if (NULL != m_pValidator) m_pEdit->setValidator(m_pValidator); } return m_pEdit; }
TValidatorTableItem::~TValidatorTableItem() { setValidator(NULL); }
Это я взял где-то на ФОРУМЕ
Название: Re: Проблемма с фильтром событий QT3.3.8
Отправлено: pastor от Июль 25, 2008, 19:40
В столбцах таблицы, где используются поля с TValidatorTableItem, все прекрасно срабатывает.
Странно все это. Как установлен фильтр для TValidatorTableItem и что вы понимаете под фразой "прекрасно срабатывает"? Приведте код фмльтра для TValidatorTableItem
Название: Re: Проблемма с фильтром событий QT3.3.8
Отправлено: Примерный ученик от Июль 25, 2008, 20:24
Создание ячейки таблицы TValidatorTableItem* pItem; pItem= new TValidatorTableItem(aTable,QTableItem::Always); pItem->setValidator(new QDoubleValidator(-9,9,3,NULL)); pItem->installEventFilter(new KeyFilter(pItem)); aTable->setItem(j,i,pItem);
Фильтр тот же. Работает, фильтр отлавливает нажатие Enter и Return
Название: Re: Проблемма с фильтром событий QT3.3.8
Отправлено: Примерный ученик от Июль 25, 2008, 20:30
А если переписать нижеследующее bool QTable::eventFilter( QObject *o, QEvent *e ) { QWidget *editorWidget = cellWidget( editRow, editCol ); switch ( e->type() ) { case QEvent::KeyPress: { QTableItem *itm = item( curRow, curCol ); int editRow = this->editRow; int editCol = this->editCol; if ((d->hasRowSpan || d->hasColSpan) && !editorWidget) { if (QTableItem *eitm = item(editRow, editCol)) { editRow = eitm->row(); editCol = eitm->col(); editorWidget = cellWidget(editRow, editCol); } } if ( isEditing() && editorWidget && o == editorWidget ) { itm = item( editRow, editCol ); QKeyEvent *ke = (QKeyEvent*)e; if ( ke->key() == Key_Escape ) { if ( !itm || itm->editType() == QTableItem::OnTyping ) endEdit( editRow, editCol, FALSE, edMode != Editing ); return TRUE; }
if ( ( ke->state() == NoButton || ke->state() == Keypad ) && ( ke->key() == Key_Return || ke->key() == Key_Enter ) ) { if ( !itm || itm->editType() == QTableItem::OnTyping ) endEdit( editRow, editCol, TRUE, edMode != Editing ); activateNextCell(); //+++++++ это убрать ++++++++++++ НЕ БУДЕТ ПЕРЕХОДА НА ДРУГУЮ КЛЕТКУ? return TRUE; }
if ( ke->key() == Key_Tab || ke->key() == Key_BackTab ) { if ( ke->state() & Qt::ControlButton ) return FALSE; if ( !itm || itm->editType() == QTableItem::OnTyping ) endEdit( editRow, editCol, TRUE, edMode != Editing ); if ( (ke->key() == Key_Tab) && !(ke->state() & ShiftButton) ) { if ( currentColumn() >= numCols() - 1 ) return TRUE; int cc = QMIN( numCols() - 1, currentColumn() + 1 ); while ( cc < numCols() ) { QTableItem *i = item( currentRow(), cc ); if ( !d->hiddenCols.find( cc ) && !isColumnReadOnly( cc ) && (!i || i->isEnabled()) ) break; ++cc; } setCurrentCell( currentRow(), cc ); } else { // Key_BackTab if ( currentColumn() == 0 ) return TRUE; int cc = QMAX( 0, currentColumn() - 1 ); while ( cc >= 0 ) { QTableItem *i = item( currentRow(), cc ); if ( !d->hiddenCols.find( cc ) && !isColumnReadOnly( cc ) && (!i || i->isEnabled()) ) break; --cc; } setCurrentCell( currentRow(), cc ); } itm = item( curRow, curCol ); if ( beginEdit( curRow, curCol, FALSE ) ) setEditMode( Editing, curRow, curCol ); return TRUE; }
if ( ( edMode == Replacing || itm && itm->editType() == QTableItem::WhenCurrent ) && ( ke->key() == Key_Up || ke->key() == Key_Prior || ke->key() == Key_Home || ke->key() == Key_Down || ke->key() == Key_Next || ke->key() == Key_End || ke->key() == Key_Left || ke->key() == Key_Right ) ) { if ( !itm || itm->editType() == QTableItem::OnTyping ) { endEdit( editRow, editCol, TRUE, edMode != Editing ); } keyPressEvent( ke ); return TRUE; } } else { QObjectList *l = viewport()->queryList( "QWidget" ); if ( l && l->find( o ) != -1 ) { delete l; QKeyEvent *ke = (QKeyEvent*)e; if ( ( ke->state() & ControlButton ) == ControlButton || ( ke->key() != Key_Left && ke->key() != Key_Right && ke->key() != Key_Up && ke->key() != Key_Down && ke->key() != Key_Prior && ke->key() != Key_Next && ke->key() != Key_Home && ke->key() != Key_End ) ) return FALSE; keyPressEvent( (QKeyEvent*)e ); return TRUE; } delete l; }
} break; case QEvent::FocusOut: if ( isEditing() && editorWidget && o == editorWidget && ( (QFocusEvent*)e )->reason() != QFocusEvent::Popup ) { QTableItem *itm = item( editRow, editCol ); if ( !itm || itm->editType() == QTableItem::OnTyping ) { endEdit( editRow, editCol, TRUE, edMode != Editing ); return TRUE; } } break; #ifndef QT_NO_WHEELEVENT case QEvent::Wheel: if ( o == this || o == viewport() ) { QWheelEvent* we = (QWheelEvent*)e; scrollBy( 0, -we->delta() ); we->accept(); return TRUE; } #endif default: break; }
return QScrollView::eventFilter( o, e ); }
Название: Re: Проблемма с фильтром событий QT3.3.8
Отправлено: pastor от Июль 25, 2008, 20:31
Работает, фильтр отлавливает нажатие Enter и Return
Т.е. если использовать TValidatorTableItem, то код QMessageBox::information( 0, "Попали"); нормально выполняеться, да?
Название: Re: Проблемма с фильтром событий QT3.3.8
Отправлено: Примерный ученик от Июль 25, 2008, 20:53
Да ???
А вот событие MouseEvent - НЕТ >:(
Название: Re: Проблемма с фильтром событий QT3.3.8
Отправлено: pastor от Июль 28, 2008, 11:28
Да ???
А вот событие MouseEvent - НЕТ >:(
Как я уже говорил выше, напишите свой агалог QComboTableItem. В ассистанте есть пример.
Название: Re: Проблемма с фильтром событий QT3.3.8
Отправлено: Примерный ученик от Июль 28, 2008, 17:17
Попробую
|