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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Отловить щелчок левой кнопки мыши по форме  (Прочитано 7453 раз)
merke
Гость
« : Декабрь 13, 2009, 12:03 »

Всем привет!
Подскажите, пожалуйста, как работать с QEvent, мне нужно отловить нажатие левой кнопки мыши на форме. Делаю что то на подобии контексного меню как в браузере в адресной строке. При нажатии на форме чтобы оно скрывалось.
Пожалуйста, приведи полный пример!

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

С уважением, Александр!
Записан
spectre71
Гость
« Ответ #1 : Декабрь 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()));
}
 
« Последнее редактирование: Декабрь 13, 2009, 12:17 от Spectre » Записан
merke
Гость
« Ответ #2 : Декабрь 13, 2009, 12:17 »

У меня контекстное меню реализовано в виде QListWidget.
Записан
BRE
Гость
« Ответ #3 : Декабрь 13, 2009, 12:20 »

У меня контекстное меню реализовано в виде QListWidget.
Какая разница, тебе же нужно само событие, говорящее о необходимости открыть контекстное меню.
Вот contextMenuEvent как раз и вызывается при этом. А что ты будешь там отображать дело твое.

Записан
spectre71
Гость
« Ответ #4 : Декабрь 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();
}
Записан
merke
Гость
« Ответ #5 : Декабрь 13, 2009, 12:25 »

спасибо!
Записан
spectre71
Гость
« Ответ #6 : Декабрь 13, 2009, 12:30 »

Малость обшибся Улыбающийся
Не так:
MyDialogObject->move(e->pos());
А вот так:
MyDialogObject->move(mapToGlobal(e->pos()));
Записан
merke
Гость
« Ответ #7 : Декабрь 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 форме?
Записан
spectre71
Гость
« Ответ #8 : Декабрь 13, 2009, 12:34 »

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

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

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

Там даже пример есть
« Последнее редактирование: Декабрь 13, 2009, 12:37 от Spectre » Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #9 : Декабрь 13, 2009, 12:50 »

>>void lineEdit::event(QEvent *ev)
А ты где-то объявил класс lineEdit?

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

Юра.
merke
Гость
« Ответ #10 : Декабрь 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);
             }
         }

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

Всем огромное спасибо за помощь!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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