在使用QT编程过程中发现QLabel没有点击事件,很多想法就不能很好的实现。经过搜索和实践,分享一个兼容性更好,更灵活的方法- - - -重写QLabel。
简单的说就是写一个子类,继承自QLabel,为这个子类添加点击事件。这样子类就拥有了QLabel的属性以及点击事件。
上代码
MYLABEL.h
#ifndef MYLABEL_H
#define MYLABEL_H
#include<QLabel>
#include<QString>
#include<QWidget>
#include<QMainWindow>
#include"QMessageBox"
class Mylabel:public QLabel
{
Q_OBJECT
public:
Mylabel(const QString &text,QWidget *parent=0);
~Mylabel(){}
signals:
void clicked();
public slots:
void slotClicked();
protected:
void mousePressEvent(QMouseEvent* event);
};
#endif // MYLABEL_H
Mylabel.cpp
#include<QLabel>
#include"MYLABEL.h"
#include"mainwindow.h"
Mylabel::Mylabel(const QString & text,QWidget* parent)
:QLabel(parent)
{
this->setText(text);
connect(this, SIGNAL(clicked()), this, SLOT(slotClicked()));
}
void Mylabel::slotClicked()
{
QMessageBox::information(NULL, QString::fromLocal8Bit("单击"),
QString::fromLocal8Bit("马衍硕是不是很帅?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
}
void Mylabel::mousePressEvent(QMouseEvent* event)
{
emit clicked();
}
Mainwindow.h
#include <QMainWindow>
#include"MYLABEL.h"
#include<QString>
class Mylabel;
class QLabel;
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
public:
Mylabel *my_label;
//QLabel *label;
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QtWidgets>
#include"MYLABEL.h"
#include<QString>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
my_label=new Mylabel("sdust",this);
my_label->setGeometry(QRect(20,20,150,30));
}
MainWindow::~MainWindow()
{
delete ui;
}
运行:
点击之前:
点击后:
OK!