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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблемма с фильтром событий QT3.3.8  (Прочитано 7840 раз)
Примерный ученик
Бывалый
*****
Offline Offline

Сообщений: 450


И это не всегда помогает


Просмотр профиля
« : Июль 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)
{
}
« Последнее редактирование: Июль 21, 2008, 20:21 от tmikola » Записан

Как мало времени и как много нужно узнать
BaltikS
Гость
« Ответ #1 : Июль 21, 2008, 14:33 »

Приведённого кода явно недостаточно! В замешательстве
Записан
Примерный ученик
Бывалый
*****
Offline Offline

Сообщений: 450


И это не всегда помогает


Просмотр профиля
« Ответ #2 : Июль 21, 2008, 20:41 »

В столбцах таблицы, где используются поля с TValidatorTableItem, все прекрасно срабатывает.
QComboTableItem прямо использовать не получается, т.к. ему метод installEventFilter не доступен.
Пришлось его переопределить, добавив в предки QObject

Записан

Как мало времени и как много нужно узнать
Примерный ученик
Бывалый
*****
Offline Offline

Сообщений: 450


И это не всегда помогает


Просмотр профиля
« Ответ #3 : Июль 25, 2008, 17:29 »

Если вешаю фильтр на QLineEdit, то он замечательно работает....
Неужели никто не подскажет куда копать?
Записан

Как мало времени и как много нужно узнать
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #4 : Июль 25, 2008, 17:48 »

В столбцах таблицы, где используются поля с TValidatorTableItem, все прекрасно срабатывает.

А что это за класс TValidatorTableItem? Можно глянуть его код?

QComboTableItem прямо использовать не получается, т.к. ему метод installEventFilter не доступен.
Пришлось его переопределить, добавив в предки QObject

Такой метод решения точно работать небудет. Как вариант можно наследовать от QTableItem и создать самому к аналог QComboTableItem, и уже в этом классе устанавливать фильтр. По той меие смотри кдасс QTableItem и метод createEditor (в ассистанте есть пример). 

ЗЫ: Нужно только помнить о времени жизни эдитора. Непомню как в Qt3, но в Qt4 эдитор уничтожаеться после завершения редавтирования. Qt3 может быть он просто хайдиться, а может быть и удуляеться также. Это стоит проверить вам.
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Примерный ученик
Бывалый
*****
Offline Offline

Сообщений: 450


И это не всегда помогает


Просмотр профиля
« Ответ #5 : Июль 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);
}

Это я взял где-то на ФОРУМЕ
Записан

Как мало времени и как много нужно узнать
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #6 : Июль 25, 2008, 19:40 »

В столбцах таблицы, где используются поля с TValidatorTableItem, все прекрасно срабатывает.

Странно все это. Как установлен фильтр для TValidatorTableItem и что вы понимаете под фразой "прекрасно срабатывает"?
Приведте код фмльтра для TValidatorTableItem
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Примерный ученик
Бывалый
*****
Offline Offline

Сообщений: 450


И это не всегда помогает


Просмотр профиля
« Ответ #7 : Июль 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
Записан

Как мало времени и как много нужно узнать
Примерный ученик
Бывалый
*****
Offline Offline

Сообщений: 450


И это не всегда помогает


Просмотр профиля
« Ответ #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 );
}

Записан

Как мало времени и как много нужно узнать
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #9 : Июль 25, 2008, 20:31 »

Работает, фильтр отлавливает нажатие Enter и Return

Т.е. если использовать TValidatorTableItem, то код

Цитировать
QMessageBox::information( 0, "Попали");

нормально выполняеться, да?
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Примерный ученик
Бывалый
*****
Offline Offline

Сообщений: 450


И это не всегда помогает


Просмотр профиля
« Ответ #10 : Июль 25, 2008, 20:53 »

Да Непонимающий

А вот событие MouseEvent - НЕТ Злой
« Последнее редактирование: Июль 25, 2008, 20:56 от tmikola » Записан

Как мало времени и как много нужно узнать
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #11 : Июль 28, 2008, 11:28 »

Да Непонимающий

А вот событие MouseEvent - НЕТ Злой

Как я уже говорил выше, напишите свой агалог QComboTableItem. В ассистанте есть пример.
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Примерный ученик
Бывалый
*****
Offline Offline

Сообщений: 450


И это не всегда помогает


Просмотр профиля
« Ответ #12 : Июль 28, 2008, 17:17 »

Попробую
Записан

Как мало времени и как много нужно узнать
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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