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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: сигнал нажатия на label  (Прочитано 8927 раз)
mishanja1988
Гость
« : Апрель 26, 2009, 07:13 »

Мне нужно, что бы при нажатии на Label, в котором картинка вызывался метод, я писал вот так:
connect(m_ui->label, SIGNAL(mousePressEvent), this, SLOT(close()));
Записан
uriel
Гость
« Ответ #1 : Апрель 26, 2009, 10:31 »

По-умолчанию QLabel не раздаёт подобные сигналы, но можно сделать двумя способами. Во-первых, если хочется всё-таки на сигналах и слотах, то можно отнаследоваться от QLabel, ловить mousePressEvent и высылать самодельный сигнал. Во-вторых, можно повесить на этот QLabel eventFilter, в нём ловить то же самое событие и напрямую вызывать метод close() нужного объекта.
Записан
SABROG
Гость
« Ответ #2 : Апрель 27, 2009, 17:47 »

Чтобы не быть голословными приведу оба варианта:

Код
C++ (Qt)
#include <QtGui/QApplication>
#include <QtGui/QMouseEvent>
#include <QtGui/QLabel>
 
class QExLabel : public QLabel
{
   Q_OBJECT
public:
   QExLabel(QWidget *parent = 0) : QLabel(parent){};
signals:
   void clicked();
protected:
   void mouseReleaseEvent(QMouseEvent *e)
   {
       if(e->button() == Qt::LeftButton)
       {
           emit clicked();
       }
   }
};
 
int main(int argc, char **argv)
{
   QApplication app(argc, argv);
   QExLabel label;
   QObject::connect(&label, SIGNAL(clicked()), &app, SLOT(quit()));
   label.show();
   return app.exec();
}
 
#include <main.moc>
 
 

//mainwindow.h
Код
C++ (Qt)
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QtCore/QtGlobal>
#include <QtCore/QtDebug>
#include <QtGui/QMainWindow>
#include <QtGui/QMouseEvent>
#include <QtGui/QErrorMessage>
 
namespace Ui
{
   class MainWindowClass;
}
 
class MainWindow : public QMainWindow
{
   Q_OBJECT
 
public:
   MainWindow(QWidget *parent = 0);
   ~MainWindow();
public slots:
   void btnClicked();
signals:
   void clicked();
protected:
   bool eventFilter(QObject *, QEvent *);
private:
   Ui::MainWindowClass *ui;
};
 
#endif // MAINWINDOW_H
 
 

//mainwindow.cpp
Код
C++ (Qt)
#include "mainwindow.h"
#include "ui_mainwindow.h"
 
MainWindow::MainWindow(QWidget *parent)
   : QMainWindow(parent), ui(new Ui::MainWindowClass)
{
   QErrorMessage::qtHandler();
   ui->setupUi(this);
 
   connect(this, SIGNAL(clicked()), SLOT(btnClicked()));
   ui->label->installEventFilter(this);
}
 
bool MainWindow::eventFilter(QObject *obj, QEvent *ev)
{
   switch(ev->type())
   {
       case QEvent::MouseButtonRelease:
       {
           QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(ev);
           if (mouseEvent->button() == Qt::LeftButton)
           {
               emit clicked();
               return true;
           }
           break;
       }
       default:;
   }
   return QObject::eventFilter(obj, ev);
}
 
void MainWindow::btnClicked()
{
   qDebug() << "clicked";
}
 
MainWindow::~MainWindow()
{
   delete ui;
}
 
 
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #3 : Апрель 27, 2009, 18:48 »

>>SIGNAL(mousePressEvent)
а где ты нашёл такой сигнал? такого сигнала нет ни у одного виджета. Это событие.
Записан

Юра.
mishanja1988
Гость
« Ответ #4 : Апрель 30, 2009, 05:41 »

Спасибо, большое, я разобрался..
Извините, если, что не так спрашиваю..
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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