信号和事件
发表于:2024-12-26 | 分类: qt
字数统计: 408 | 阅读时长: 1分钟 | 阅读量:

自定义信号+事件

事件和信号

除了使用事件直接处理,qt也支持自定义信号处理

  • 新控件自定义新的信号(需要继承原生组件才能生效,使用时也要使用新组件【不能使用ui设计器,使用代码方式】)
  • 事件发送信号(在新控件中处理事件)
  • 手动连接该信号和槽(在窗口中处理)
  • 自定义对应的槽函数(在窗口中处理)

案例

code

自定义的控件,继承QPushButton,多了buttonClicked()这个信号

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

#include <QPushButton>

class MyButton : public QPushButton {
Q_OBJECT

public:
MyButton(QWidget *parent = nullptr);

signals:
// 自定义信号
void buttonClicked();

protected:
// 重写鼠标点击事件
void mousePressEvent(QMouseEvent *event);
};

#endif
1
2
3
4
5
6
7
8
9
#include "MyButton.h"
#include <QMouseEvent>

MyButton::MyButton(QWidget *parent) : QPushButton(parent) {}

void MyButton::mousePressEvent(QMouseEvent *event) {
Q_UNUSED(event); // 防止编译器警告(未使用参数event)
emit buttonClicked(); // 发射自定义信号
}

窗口

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
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include "MyButton.h"
#include <QMainWindow>

class MainWindow : public QMainWindow {
Q_OBJECT

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

private slots:
// 槽函数
void onButtonClicked();

private:
// 声明需要的控件(自定义按钮,不能通过设计器添加【原生控件】)
MyButton *button;
// 点击次数
int count;
};

#endif
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "MainWindow.h"

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {
button = new MyButton(this);
button->setText("点击我");
// 构造函数中手动连接信号与槽
connect(button, &MyButton::buttonClicked, this, &MainWindow::onButtonClicked);
}

MainWindow::~MainWindow() { delete button; }

void MainWindow::onButtonClicked() {
count++;
button->setText("点击次数:" + QString::number(count));
}
1
2
3
4
5
6
7
8
9
#include "MainWindow.h"
#include <QApplication>

int main(int argc, char *argv[]) {
QApplication app(argc, argv);
MainWindow w;
w.show();
return app.exec();
}

效果

上一篇:
qt常用组件
下一篇:
事件