qt

1.单文件

点击事件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <QApplication>
#include <QDebug>
#include <QPushButton>
#include <QWidget>

int main(int argc, char *argv[]) {
QApplication a(argc, argv);
QWidget *hw = new QWidget(); // main GUI window
hw->show(); // hw is the real window
QPushButton *button = new QPushButton("Click Me", hw);
button->show();
QObject::connect(button, &QPushButton::clicked, []() {
qDebug() << "Button clicked!";
});
return a.exec();
}

按压与释放事件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <QApplication>
#include <QDebug>
#include <QPushButton>
#include <QWidget>

int main(int argc, char *argv[]) {
QApplication a(argc, argv);
QWidget *hw = new QWidget(); // main GUI window
hw->show(); // hw is the real window
QPushButton *button = new QPushButton("Click Me", hw);
button->show();
// 鼠标按下(还没抬起)
QObject::connect(button, &QPushButton::pressed, []() {
qDebug() << "Mouse Pressed!";
});

// 鼠标释放
QObject::connect(button, &QPushButton::released, []() {
qDebug() << "Mouse Released!";
});
return a.exec();
}

2.单文件类写法

鼠标位置与点击窗口事件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <QApplication>
#include <QDebug>
#include <QPushButton>
#include <QWidget>
#include <QMouseEvent>

// 1. 定义一个自己的窗口类
class MyWindow : public QWidget {
public:
MyWindow() {
setMouseTracking(true); // 开启鼠标追踪,否则只有按下时才触发 moveEvent
}

protected:
// 重写鼠标按下事件
void mousePressEvent(QMouseEvent *event) override {
if (event->button() == Qt::LeftButton) {
qDebug() << "Left Mouse Clicked at:" << event->pos();
} else if (event->button() == Qt::RightButton) {
qDebug() << "Right Mouse Clicked!";
}
}

// 重写鼠标移动事件
void mouseMoveEvent(QMouseEvent *event) override {
// 打印鼠标当前相对于窗口的坐标
qDebug() << "Mouse Moving:" << event->pos().x() << "," << event->pos().y();
}
};

int main(int argc, char *argv[]) {
QApplication a(argc, argv);

MyWindow hw; // 使用我们的自定义窗口
hw.resize(400, 300);
hw.show();

QPushButton *button = new QPushButton("Click Me", &hw);

QObject::connect(button, &QPushButton::clicked, []() {
qDebug() << "Button logic still works!";
});

return a.exec();
}

3.多文件类写法

1. widget.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QPushButton>

class Widget : public QWidget {
Q_OBJECT

public:
Widget(QWidget *parent = nullptr);
~Widget();

// 核心修改:声明槽函数
private slots:
void onButtonClicked();

private:
QPushButton *m_button;
int m_count = 0; // 记录点击次数的变量
};

#endif

2. widget.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include "widget.h"
#include <QDebug>

Widget::Widget(QWidget *parent) : QWidget(parent) {
this->setWindowTitle("信号槽连接方法示例");
this->resize(400, 300);

m_button = new QPushButton("点击计数", this);
m_button->setGeometry(150, 130, 100, 40);

// 核心修改:连接信号到类成员方法
// 参数1: 发送者 (指针)
// 参数2: 信号的函数地址
// 参数3: 接收者 (通常是 this 指针)
// 参数4: 槽函数的函数地址
connect(m_button, &QPushButton::clicked, this, &Widget::onButtonClicked);
// 旧版语法 (Qt 4 风格)
//connect(m_button, SIGNAL(clicked()), this, SLOT(onButtonClicked()));
}

// 槽函数的具体实现
void Widget::onButtonClicked() {
m_count++; // 访问类成员变量
QString msg = QString("按钮被点击了 %1 次").arg(m_count);

// 修改窗口标题显示结果
this->setWindowTitle(msg);
qDebug() << msg;
}

Widget::~Widget() {}

3. main.cpp

1
2
3
4
5
6
7
8
9
10
11
#include <QApplication>
#include "widget.h"

int main(int argc, char *argv[]) {
QApplication a(argc, argv);

Widget w;
w.show();

return a.exec();
}