простой способ для достижения этой цели, без необходимости каких-либо подклассов, является источником сигнала, который отслеживает события на какой-либо объект и выдает соответствующие сигналы:
// main.cpp - this is a single-file example
#include <QtWidgets>
class MouseButtonSignaler : public QObject {
Q_OBJECT
bool eventFilter(QObject * obj, QEvent * ev) Q_DECL_OVERRIDE {
if ((ev->type() == QEvent::MouseButtonPress
|| ev->type() == QEvent::MouseButtonRelease
|| ev->type() == QEvent::MouseButtonDblClick)
&& obj->isWidgetType())
emit mouseButtonEvent(static_cast<QWidget*>(obj),
static_cast<QMouseEvent*>(ev));
return false;
}
public:
Q_SIGNAL void mouseButtonEvent(QWidget *, QMouseEvent *);
MouseButtonSignaler(QObject * parent = 0) : QObject(parent) {}
void installOn(QWidget * widget) {
widget->installEventFilter(this);
}
};
emit
ключевое слово является пустой макрос, Qt определяет его следующим образом:
#define emit
Он предназначен для использования людьми в качестве префикса документации помощи только компилятор и moc
игнорировать его. В качестве документационного обеспечения это означает: следующий вызов метода - это излучение сигнала. Сигналы - это просто методы, реализация которых сгенерирована для вас moc
- вот почему мы должны указать #include "main.moc"
ниже, чтобы включить все реализации, которые moc
сгенерировал для класса (-ов) объекта в этом файле. В противном случае нет ничего особенного или магического сигнала. В этом примере вы можете посмотреть в папке сборки файл с именем main.moc
и посмотреть реализацию (определение) void MouseButtonSignaler::mouseButtonEvent(..)
.
Вы можете установить такой сигнализатор на любом количестве виджетов, такие как QLabel
:
int main(int argc, char ** argv) {
QApplication app(argc, argv);
MouseButtonSignaler signaler;
QWidget w;
QVBoxLayout layout(&w);
QLabel label("text");
QLineEdit edit;
layout.addWidget(&label);
layout.addWidget(&edit);
signaler.installOn(&label);
QObject::connect(&signaler, &MouseButtonSignaler::mouseButtonEvent,
[&label, &edit](QWidget*, QMouseEvent * event) {
if (event->type() == QEvent::MouseButtonPress)
edit.setText(label.text());
});
w.show();
return app.exec();
}
#include "main.moc"
вы должны создать подкласс QLabel: смотрите здесь https://wiki.qt.io/Clickable_QLabel – gengisdave
я бы испускать сигнал на ' mouseReleaseEvent', а не 'mousePressEvent'. Щелчок не завершен до тех пор, пока мышь не будет отпущена. – Bowdzone