Russian Qt Forum

Qt => Общие вопросы => Тема начата: merke от Декабрь 13, 2009, 12:03



Название: Отловить щелчок левой кнопки мыши по форме
Отправлено: merke от Декабрь 13, 2009, 12:03
Всем привет!
Подскажите, пожалуйста, как работать с QEvent, мне нужно отловить нажатие левой кнопки мыши на форме. Делаю что то на подобии контексного меню как в браузере в адресной строке. При нажатии на форме чтобы оно скрывалось.
Пожалуйста, приведи полный пример!

Буду очень благодарен!

С уважением, Александр!


Название: Re: Отловить щелчок левой кнопки мыши по форме
Отправлено: spectre71 от Декабрь 13, 2009, 12:15
Всем привет!
Подскажите, пожалуйста, как работать с QEvent, мне нужно отловить нажатие левой кнопки мыши на форме. Делаю что то на подобии контексного меню как в браузере в адресной строке. При нажатии на форме чтобы оно скрывалось.
Пожалуйста, приведи полный пример!

Буду очень благодарен!

С уважением, Александр!


Для вызова контекстного меню лучше использовать:
virtual void QWidget::contextMenuEvent ( QContextMenuEvent * event )
===

Код
C++ (Qt)
void MyWidget::contextMenuEvent(QContextMenuEvent *e) {
 e->accept();
 MyPopupMenu->exec(mapToGlobal(e->pos()));
}
 


Название: Re: Отловить щелчок левой кнопки мыши по форме
Отправлено: merke от Декабрь 13, 2009, 12:17
У меня контекстное меню реализовано в виде QListWidget.


Название: Re: Отловить щелчок левой кнопки мыши по форме
Отправлено: BRE от Декабрь 13, 2009, 12:20
У меня контекстное меню реализовано в виде QListWidget.
Какая разница, тебе же нужно само событие, говорящее о необходимости открыть контекстное меню.
Вот contextMenuEvent как раз и вызывается при этом. А что ты будешь там отображать дело твое.



Название: Re: Отловить щелчок левой кнопки мыши по форме
Отправлено: spectre71 от Декабрь 13, 2009, 12:23
У меня контекстное меню реализовано в виде QListWidget.

Тогда клади его например на диалог с флагом Qt::Popup

Код
C++ (Qt)
MyDialog::MyDialog(QWidget *parent) : QDialog(parent)  {
 ui.setupUi(this);
 setWindowFlags(Qt::Popup);
}

И примерно так вызывай

Код
C++ (Qt)
void MyWidget::contextMenuEvent(QContextMenuEvent *e) {
 e->accept();
 MyDialogObject->move(e->pos());
 MyDialogObject->show();
}


Название: Re: Отловить щелчок левой кнопки мыши по форме
Отправлено: merke от Декабрь 13, 2009, 12:25
спасибо!


Название: Re: Отловить щелчок левой кнопки мыши по форме
Отправлено: spectre71 от Декабрь 13, 2009, 12:30
Малость обшибся :)
Не так:
MyDialogObject->move(e->pos());
А вот так:
MyDialogObject->move(mapToGlobal(e->pos()));


Название: Re: Отловить щелчок левой кнопки мыши по форме
Отправлено: merke от Декабрь 13, 2009, 12:31
Мне бы вообще теперь хотелось бы понять как работать с QEvent, например у меня есть Ui форма на ней компоненты какие либо, например lineEdit. Вот как мне отлавливать нажатие той же самой клавиши по данному виджету?

Я писал вот так:

Код:
void lineEdit::event(QEvent *ev)
{
    if (ev->type() == QEvent::MouseButtonDblClick)
    {
     QMessageBox::warning(this, QString::fromLocal8Bit("Бла бла бла"),
                                QString::fromLocal8Bit("бла бла бла"),
                                QMessageBox::Cancel);
    }

}

Но тут ошибка C:/dev/Kursovaya/mainwindow.cpp:368: error: `lineEdit' has not been declared

Пишу тогда ui->lineEdit::event

И тоже ошибка. Подскажите, плиз, как тут обратится к виджету который находится на ui форме?


Название: Re: Отловить щелчок левой кнопки мыши по форме
Отправлено: spectre71 от Декабрь 13, 2009, 12:34
И тоже ошибка. Подскажите, плиз, как тут обратится к виджету который находится на ui форме?

Повесить на него фильтр событий.

Смотри:
virtual bool QObject::eventFilter ( QObject * watched, QEvent * event )

Там даже пример есть


Название: Re: Отловить щелчок левой кнопки мыши по форме
Отправлено: lit-uriy от Декабрь 13, 2009, 12:50
>>void lineEdit::event(QEvent *ev)
А ты где-то объявил класс lineEdit?

>>Пишу тогда ui->lineEdit::event
Такая запись в Си++, вообще ничего не значит.


Название: Re: Отловить щелчок левой кнопки мыши по форме
Отправлено: merke от Декабрь 13, 2009, 13:02
В общем задачу решил следующим образом.
В заголовочном файле моего класса прописал защищённую функцию

Код:
protected:
             bool eventFilter(QObject *obj, QEvent *ev);

В конструкторе класса прописал

   
Код:
 ui->centralWidget->installEventFilter(this);

И далее прописал как в примере:

 
Код:
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
         {
             if (obj == ui->centralWidget) {
                 if (event->type() == QEvent::MouseButtonPress) {
                     //QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
                     //qDebug() << "Ate key press" << keyEvent->key();
                     ui->listWidget->hide();
                     return true;
                 } else {
                     return false;
                 }
             } else {
                 // pass the event on to the parent class
                 return QMainWindow::eventFilter(obj, event);
             }
         }

И всё заработало!!!

Всем огромное спасибо за помощь!