Qt C++ QLabel 可点击鼠标事件不起作用
Qt C++ QLabel Clickable mouse events doesn't work
我有很大的疑问和问题。在尝试了很多教程和示例之后,我无法在我的 QLabel 中收到信号点击。如果我这样做,但在 QDialog 中(而不是在 QLabel 中),我可以知道鼠标的状态。
我粘贴我的示例代码,在此之前,我介绍我制作项目的步骤:
我创建了一个项目,创建了一个 QMainWindow(名为 testWindow,以图形方式创建),然后添加了一个 QLabel (lblMouse),并将 mouseTracking 属性 标记为 true。执行后,我的 QLabel lblMouse 对我的鼠标事件没有反应。
另外一个疑惑是:执行完我的程序后,我的QLabel的文本不是我在他的构造函数中赋值的"Hello",而是在执行完ui之后才执行?我可以使用 ui->lblMouse->setText("Hello"); 从 ui 的构造函数更改它; (可能是我出错了,我是C程序员,正在尝试进入C++世界)
之后,我编辑代码(testWindow.cpp 和 testWindow.h):
这是我的 cpp 代码:
testWindow::testWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::testWindow)
{
ui->setupUi(this);
//It will not be neccesary because I mark on the checkbox of mouseTracking
ui->lblMouse->setMouseTracking(true);
connect(ui->lblMouse, SIGNAL(Mouse_Pos()), this, SLOT(Mouse_current_pos()));
connect(ui->lblMouse, SIGNAL(Mouse_Pressed()), this, SLOT(Mouse_Pressed()));
connect(ui->lblMouse, SIGNAL(Mouse_Left()), this, SLOT(Mouse_left()));
}
testWindow::~testWindow()
{
delete ui;
}
void testWindow::Mouse_current_pos()
{
ui->lblMouse_Current_Pos->setText(QString("X = aa, Y = aa")/*.arg(ui->lblMouse->x())*/);
}
void testWindow::Mouse_Pressed()
{
ui->lblMouse_Current_Pos->setText(QString("X = aa, Y = aa")/*.arg(ui->lblMouse->x())*/);
}
void testWindow::Mouse_left()
{
ui->lblMouse_Current_Pos->setText(QString("X = aa, Y = aa")/*.arg(ui->lblMouse->x())*/);
}
lblMouse::lblMouse(QWidget *parent): QLabel(parent)
{
// strange for me, the initial text of the label is not Hello
this->setText("Hello");
}
lblMouse::~lblMouse()
{
}
void lblMouse::mouseMoveEvent(QMouseEvent *ev)
{
this->xpos = ev->x();
this->ypos = ev->y();
emit Mouse_Pos();
}
void lblMouse::mousePressEvent(QMouseEvent *)
{
emit Mouse_Pressed();
// ev->x();
}
void lblMouse::leaveEvent(QEvent *)
{
emit Mouse_Left();
}
这是我的 h 文件:
#ifndef TESTWINDOW_H
#define TESTWINDOW_H
#include <QMainWindow>
#include <QLabel>
#include <QMouseEvent>
#include <QEvent>
#include <QDebug>
namespace Ui {
class testWindow;
class lblMouse;
}
class lblMouse : public QLabel
{
Q_OBJECT
public:
explicit lblMouse(QWidget *parent = 0);
~lblMouse();
int xpos,ypos;
void leaveEvent(QEvent *);
protected:
void mouseMoveEvent(QMouseEvent *ev);
void mousePressEvent(QMouseEvent *ev);
signals:
void Mouse_Pressed();
void Mouse_Pos();
void Mouse_Left();
};
class testWindow : public QMainWindow
{
Q_OBJECT
public:
explicit testWindow(QWidget *parent = 0);
~testWindow();
private:
Ui::testWindow *ui;
private slots:
void Mouse_current_pos();
void Mouse_Pressed();
void Mouse_left();
};
#endif // TESTWINDOW_H
此外,这是我的 .ui 文件(感谢@Thomas):
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>testWindow</class>
<widget class="QMainWindow" name="testWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>600</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<widget class="QLabel" name="lblMouse">
<property name="geometry">
<rect>
<x>20</x>
<y>60</y>
<width>331</width>
<height>241</height>
</rect>
</property>
<property name="mouseTracking">
<bool>true</bool>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
<property name="text">
<string>Mouse Area</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
<widget class="QGroupBox" name="groupBox">
<property name="geometry">
<rect>
<x>400</x>
<y>50</y>
<width>201</width>
<height>191</height>
</rect>
</property>
<property name="title">
<string>Mouse Events</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="lblMouse_Current_Pos">
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<property name="text">
<string>x=0, Y=0</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="lblMouse_Current_Event">
<property name="frameShape">
<enum>QFrame::Panel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>23</height>
</rect>
</property>
<widget class="QMenu" name="menuMenu">
<property name="title">
<string>&Menu</string>
</property>
<addaction name="actionImportar"/>
</widget>
<addaction name="menuMenu"/>
</widget>
<widget class="QStatusBar" name="statusbar"/>
<action name="actionImportar">
<property name="text">
<string>&Importar...</string>
</property>
</action>
</widget>
<resources/>
<connections/>
</ui>
编辑:
我在控制台中看到 运行time 错误(不是编译错误,我在 运行 程序后收到此消息,但它继续 运行ning) :
- QObject::connect: QLabel::Mouse_Left() 中没有这样的信号
../testwindow.cpp:17
- QObject::connect:(发件人姓名:'lblMouse')
- QObject::connect:(接收者名称:'testWindow')
PD:我不确定这是否是问题所在。我已经测试了其他方法来做到这一点,但效果不佳。
谢谢!
您在 ui 中的标签是 QLabel class,但您创建了 lblMouse。因此,在 ui 中,您必须更改代码
<widget class="QLabel" name="lblMouse">
至
<widget class="lblMouse" name="lblMouse">
编辑:
要更改此设置,您可以:
- 使用任何文本编辑器;
- 转到 Qt Creator 中的设计器,选择您的 ui、select 您的
QLabel
,调用上下文菜单并单击“提升为...”。然后检查“Base class name”是否正确(QLabel
),把你的class(lblMouse
)写在“Promoted class name”字段,单击“Add”按钮,然后单击“提升”按钮。就这样。您的标签现在是您自己的标签 class.
关于setText()
方法。
- 转到设计器;
- 选择您的标签;
- 在右侧的对象属性中找到
QLabel
区域并单击“text”前面的圆形箭头属性。就这样。现在,如果您在构造函数中执行 setText()
方法 - 它会起作用。
您只需要使用您的 lblMouse
class。
在 .h 文件中,将此添加到 class testWindow
lblMouse *lblMouse_Current_Pos;
在 .cpp 文件中,在构造函数中添加:
lblMouse_Current_Pos = new lblMouse(this);
lblMouse_Current_Pos->setMouseTracking(true);
connect(lblMouse_Current_Pos, SIGNAL(Mouse_Pos()), this, SLOT(Mouse_current_pos()));
connect(lblMouse_Current_Pos, SIGNAL(Mouse_Pressed()), this, SLOT(Mouse_Pressed()));
connect(lblMouse_Current_Pos, SIGNAL(Mouse_Left()), this, SLOT(Mouse_left()));
我有很大的疑问和问题。在尝试了很多教程和示例之后,我无法在我的 QLabel 中收到信号点击。如果我这样做,但在 QDialog 中(而不是在 QLabel 中),我可以知道鼠标的状态。
我粘贴我的示例代码,在此之前,我介绍我制作项目的步骤:
我创建了一个项目,创建了一个 QMainWindow(名为 testWindow,以图形方式创建),然后添加了一个 QLabel (lblMouse),并将 mouseTracking 属性 标记为 true。执行后,我的 QLabel lblMouse 对我的鼠标事件没有反应。
另外一个疑惑是:执行完我的程序后,我的QLabel的文本不是我在他的构造函数中赋值的"Hello",而是在执行完ui之后才执行?我可以使用 ui->lblMouse->setText("Hello"); 从 ui 的构造函数更改它; (可能是我出错了,我是C程序员,正在尝试进入C++世界)
之后,我编辑代码(testWindow.cpp 和 testWindow.h):
这是我的 cpp 代码:
testWindow::testWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::testWindow)
{
ui->setupUi(this);
//It will not be neccesary because I mark on the checkbox of mouseTracking
ui->lblMouse->setMouseTracking(true);
connect(ui->lblMouse, SIGNAL(Mouse_Pos()), this, SLOT(Mouse_current_pos()));
connect(ui->lblMouse, SIGNAL(Mouse_Pressed()), this, SLOT(Mouse_Pressed()));
connect(ui->lblMouse, SIGNAL(Mouse_Left()), this, SLOT(Mouse_left()));
}
testWindow::~testWindow()
{
delete ui;
}
void testWindow::Mouse_current_pos()
{
ui->lblMouse_Current_Pos->setText(QString("X = aa, Y = aa")/*.arg(ui->lblMouse->x())*/);
}
void testWindow::Mouse_Pressed()
{
ui->lblMouse_Current_Pos->setText(QString("X = aa, Y = aa")/*.arg(ui->lblMouse->x())*/);
}
void testWindow::Mouse_left()
{
ui->lblMouse_Current_Pos->setText(QString("X = aa, Y = aa")/*.arg(ui->lblMouse->x())*/);
}
lblMouse::lblMouse(QWidget *parent): QLabel(parent)
{
// strange for me, the initial text of the label is not Hello
this->setText("Hello");
}
lblMouse::~lblMouse()
{
}
void lblMouse::mouseMoveEvent(QMouseEvent *ev)
{
this->xpos = ev->x();
this->ypos = ev->y();
emit Mouse_Pos();
}
void lblMouse::mousePressEvent(QMouseEvent *)
{
emit Mouse_Pressed();
// ev->x();
}
void lblMouse::leaveEvent(QEvent *)
{
emit Mouse_Left();
}
这是我的 h 文件:
#ifndef TESTWINDOW_H
#define TESTWINDOW_H
#include <QMainWindow>
#include <QLabel>
#include <QMouseEvent>
#include <QEvent>
#include <QDebug>
namespace Ui {
class testWindow;
class lblMouse;
}
class lblMouse : public QLabel
{
Q_OBJECT
public:
explicit lblMouse(QWidget *parent = 0);
~lblMouse();
int xpos,ypos;
void leaveEvent(QEvent *);
protected:
void mouseMoveEvent(QMouseEvent *ev);
void mousePressEvent(QMouseEvent *ev);
signals:
void Mouse_Pressed();
void Mouse_Pos();
void Mouse_Left();
};
class testWindow : public QMainWindow
{
Q_OBJECT
public:
explicit testWindow(QWidget *parent = 0);
~testWindow();
private:
Ui::testWindow *ui;
private slots:
void Mouse_current_pos();
void Mouse_Pressed();
void Mouse_left();
};
#endif // TESTWINDOW_H
此外,这是我的 .ui 文件(感谢@Thomas):
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>testWindow</class>
<widget class="QMainWindow" name="testWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>600</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<widget class="QLabel" name="lblMouse">
<property name="geometry">
<rect>
<x>20</x>
<y>60</y>
<width>331</width>
<height>241</height>
</rect>
</property>
<property name="mouseTracking">
<bool>true</bool>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
<property name="text">
<string>Mouse Area</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
<widget class="QGroupBox" name="groupBox">
<property name="geometry">
<rect>
<x>400</x>
<y>50</y>
<width>201</width>
<height>191</height>
</rect>
</property>
<property name="title">
<string>Mouse Events</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="lblMouse_Current_Pos">
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<property name="text">
<string>x=0, Y=0</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="lblMouse_Current_Event">
<property name="frameShape">
<enum>QFrame::Panel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>23</height>
</rect>
</property>
<widget class="QMenu" name="menuMenu">
<property name="title">
<string>&Menu</string>
</property>
<addaction name="actionImportar"/>
</widget>
<addaction name="menuMenu"/>
</widget>
<widget class="QStatusBar" name="statusbar"/>
<action name="actionImportar">
<property name="text">
<string>&Importar...</string>
</property>
</action>
</widget>
<resources/>
<connections/>
</ui>
编辑:
我在控制台中看到 运行time 错误(不是编译错误,我在 运行 程序后收到此消息,但它继续 运行ning) :
- QObject::connect: QLabel::Mouse_Left() 中没有这样的信号 ../testwindow.cpp:17
- QObject::connect:(发件人姓名:'lblMouse')
- QObject::connect:(接收者名称:'testWindow')
PD:我不确定这是否是问题所在。我已经测试了其他方法来做到这一点,但效果不佳。
谢谢!
您在 ui 中的标签是 QLabel class,但您创建了 lblMouse。因此,在 ui 中,您必须更改代码
<widget class="QLabel" name="lblMouse">
至
<widget class="lblMouse" name="lblMouse">
编辑:
要更改此设置,您可以:
- 使用任何文本编辑器;
- 转到 Qt Creator 中的设计器,选择您的 ui、select 您的
QLabel
,调用上下文菜单并单击“提升为...”。然后检查“Base class name”是否正确(QLabel
),把你的class(lblMouse
)写在“Promoted class name”字段,单击“Add”按钮,然后单击“提升”按钮。就这样。您的标签现在是您自己的标签 class.
关于setText()
方法。
- 转到设计器;
- 选择您的标签;
- 在右侧的对象属性中找到
QLabel
区域并单击“text”前面的圆形箭头属性。就这样。现在,如果您在构造函数中执行setText()
方法 - 它会起作用。
您只需要使用您的 lblMouse
class。
在 .h 文件中,将此添加到 class testWindow
lblMouse *lblMouse_Current_Pos;
在 .cpp 文件中,在构造函数中添加:
lblMouse_Current_Pos = new lblMouse(this);
lblMouse_Current_Pos->setMouseTracking(true);
connect(lblMouse_Current_Pos, SIGNAL(Mouse_Pos()), this, SLOT(Mouse_current_pos()));
connect(lblMouse_Current_Pos, SIGNAL(Mouse_Pressed()), this, SLOT(Mouse_Pressed()));
connect(lblMouse_Current_Pos, SIGNAL(Mouse_Left()), this, SLOT(Mouse_left()));