1 介绍
在QLabel中没有双击等事件响应,需要构建其派生类,自定义信号(signals)、重载事件函数(event),最后在Qwidget中使用connect链接即可,进而实现响应功能。
对于其余没有需求事件响应的QObject同样适用。
此外,该功能同样可以使用事件过滤器,将QLable所需的双击事件功能委托给其它QObject如QWidget来处理。
2 过程
2.1 构建派生类
2.2 自定义信号,重载事件函数
信号doubleClicked、 与mouseDoubleClickEvent声明:
与mouseDoubleClickEvent定义:
注:信号doubleClicked在Qt中有内置定义,不需要重载。
2.3 QWidget中的connect链接
3 代码
tmylabel.h
#ifndef TMYLABEL_H
#define TMYLABEL_H
#include <QLabel>
#include <QObject>
#include <QMainWindow>
class TMyLabel : public QLabel
{
Q_OBJECT
public:
TMyLabel(QWidget *parent = nullptr);
signals:
void doubleClicked();
// QWidget interface
protected:
virtual void mouseDoubleClickEvent(QMouseEvent *event) override;
// QObject interface
public:
virtual bool event(QEvent *event) override;
};
#endif // TMYLABEL_H
tmylabel.cpp
#include "tmylabel.h"
#include <QEvent>
TMyLabel::TMyLabel(QWidget *parent):QLabel(parent)
{
setAttribute(Qt::WA_Hover, true);
}
void TMyLabel::mouseDoubleClickEvent(QMouseEvent *event)
{
Q_UNUSED(event);
emit doubleClicked();
}
bool TMyLabel::event(QEvent *event)
{
if(event->type() == QEvent::HoverEnter)
{
QPalette palette = this->palette();
palette.setColor(QPalette::WindowText, Qt::red);
setPalette(palette);
}
else if(event->type() == QEvent::HoverLeave)
{
QPalette palette = this->palette();
palette.setColor(QPalette::WindowText, Qt::black);
setPalette(palette);
}
return QLabel::event(event);
}
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(ui->label, &TMyLabel::doubleClicked, this, &MainWindow::do_double_clicked);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::do_double_clicked()
{
ui->label->setText("label被双击,自定义信号槽响应");
}
void MainWindow::mouseDoubleClickEvent(QMouseEvent *event)
{
Q_UNUSED(event);
ui->label->setText("窗口被双击");
ui->label->adjustSize();
}
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void do_double_clicked();
private:
Ui::MainWindow *ui;
// QWidget interface
protected:
virtual void mouseDoubleClickEvent(QMouseEvent *event) override;
};
#endif // MAINWINDOW_H