15 信号与槽

在Qt中使用信号和槽机制来完成对象之间的协同操作。  

简单来说,信号和槽都是函数,比如按下窗口上的一个按钮后想要改变一个窗口上label的文字,那么就可以将这个按钮的单击信号和我们定义的槽关联起来,在槽中中修改label上的文字。这样,当单击这个按钮时就会发射信号,进而执行我们的槽来修改文字。

信号与槽的三种关联方式:

  1. 使用connect()关联
  2. 设计模式中关联
  3. 自动关联

关联方式一:使用connect()关联

实例代码:

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private:
    Ui::Widget *ui;
private slots:
    void showChildDialog();  //槽声明
};

#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    connect(ui->pushButtonOn, SIGNAL(clicked()),  //实现信号与槽的连接
                this, SLOT(showChildDialog()));

}

Widget::~Widget()
{
    delete ui;
}

void Widget::showChildDialog()  //槽实现
{
    ui->labelOn->setText("PushButtonConnectClicked");
    ui->labelOn->resize(20,30);
}

说明:

这里自定义了一个槽,槽一般使用slots关键字进行修饰(Qt 4中必须使用,Qt 5使用新connect语法时可以不用,为了与一般函数进行区别,建议使用),这里使用了private slots,表明这个槽不可以在类外被调用。

clicked()信号在QPushButton类中进行了定义,而connect()是QObject类中的函数,因为我们的类继承自QObject,所以可以直接使用它。

connect函数原型:

QMetaObject::Connection	connect(const QObject * sender, const char * signal,
             const char * method, Qt::ConnectionType type = Qt::AutoConnection) const

connect()函数中的四个参数分别是:发送信号的对象、发送的信号、接收信号的对象和要执行的槽。

当指定信号signal时必须使用QT的宏SIGNAL()当指定槽函数时必须使用宏SLOT()。如果发射者和接收者属于同一个对象的话,那么在connect调用中接收者参数能省略。 

 

关联方式二:在设计模式关联

首先添加自定义对话框类MyDialog。在设计模式中向窗口上添加两个Push Button,并且分别更改其显示文本为“进入主界面”和“退出程序”。

点击设计器上方的“编辑信号/槽”图标,或者按下快捷键F4,这时便进入了部件的信号和槽的编辑模式。在“退出程序”按钮上按住鼠标左键,然后拖动到窗口界面上,这时松开鼠标左键。

在弹出的配置连接对话框中,选中下面的“显示从QWidget继承的信号和槽”选项,然后在左边的QPushButton栏中选择信号clicked(),在右边的QDialog栏中选择对应的槽close(),完成后按下“确定”。

关联方式三:自动关联

在“进入主界面”按钮上右击,在弹出的菜单上选择“转到槽”,然后在弹出的对话框中选择clicked()信号,并按“确定”。这时便会进入代码编辑模式,并且定位到自动生成的on_pushButton_clicked()槽中。在其中添加代码:

会自动生成函数:

void MyDialog::on_pushButton_clicked()
{
    //里面的就可以自己填充
} 

自动关联就是将关联函数整合到槽命名中。

例如on_pushButton_clicked()就是由字符“on”和发射信号的部件对象名,还有信号名组成。这样就可以去掉那个connect()关联函数了。每当pushButton被按下,就会发射clicked()信号,然后就会执行on_pushButton_clicked()槽。

这里accept()函数是QDialog类中的一个槽,对于一个使用exec()函数实现的模态对话框,执行了这个槽,就会隐藏这个模态对话框,并返回QDialog::Accepted值,我们就是要使用这个值来判断是哪个按钮被按下了。与其对应的还有一个reject()槽,它可以返回一个QDialog::Rejected值。其实,前面的“退出程序”按钮也可以关联这个槽。

 

断开联系

当信号和槽没有必要继续保持关联时,我们能使用disconnect函数来断开连接。其定义如下: 

bool QObject::disconnect ( const QObject * sender, const char * signal, 
                    const Object * receiver, const char * member ) [static] 

这个函数断开发射者中的信号和接收者中的槽函数之间的关联。 
有三种情况必须使用disconnect()函数: 
(1)断开和某个对象相关联的所有对象。这似乎有点不可理解,事实上,当我们在某个对象中定义了一个或多个信号,这些信号和另外若干个对象中的槽相关联,如果我们要切断这些关联的话,就能利用这个方法,非常之简洁

disconnect( myObject, 0, 0, 0 ) 或 myObject->disconnect() 

(2)断开和某个特定信号的所有关联。 

disconnect( myObject, SIGNAL(mySignal()), 0, 0 ) 或 myObject->disconnect( SIGNAL(mySignal()) ) 

(3)断开两个对象之间的关联。 

disconnect( myObject, 0, myReceiver, 0 ) 或 myObject->disconnect( myReceiver ) 

在disconnect函数中0能用作一个通配符,分别表示所有信号、所有接收对象、接收对象中的所有槽函数。不过发射者sender不能为0,其他三个参数的值能等于0。 

参考:

https://blog.csdn.net/michealtx/article/details/6858784

https://www.cnblogs.com/liushui-sky/p/5732931.html

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当使用Qt设计器来创建计算器界面时,您可以通过以下步骤实现信号函数的关联,并实现加减乘除功能: 1. 打开Qt设计器,创建一个新的Qt Widgets应用程序项目。 2. 在设计器中,将一个QLineEdit文本框控件拖放到主窗口中,用于显示计算结果。 3. 拖放10个QPushButton按钮控件到主窗口中,分别表示0到9的数字按钮。 4. 拖放4个QPushButton按钮控件到主窗口中,分别表示加号、减号、乘号和除号。 5. 拖放一个QPushButton按钮控件到主窗口中,表示等号按钮。 6. 拖放一个QPushButton按钮控件到主窗口中,表示清除按钮。 7. 在设计器中选择第一个数字按钮(0),右键点击该按钮,选择"转到"。在弹出的对话框中选择"clicked()"信号,并点击"编辑"按钮。 8. 在编辑函数的窗口中,编写相应的函数实现。例如,可以将以下代码添加到函数中: ```cpp void MainWindow::on_button_0_clicked() { ui->lineEdit_result->setText(ui->lineEdit_result->text() + "0"); } ``` 这段代码将在按钮被点击时,在结果文本框中追加数字0。 9. 重复步骤7和步骤8,为其他数字按钮、操作符按钮、等号按钮和清除按钮创建函数。 10. 在设计器中选择等号按钮,右键点击该按钮,选择"转到"。在弹出的对话框中选择"clicked()"信号,并点击"编辑"按钮。 11. 在编辑函数的窗口中,编写执行计算操作的函数实现。例如,可以将以下代码添加到函数中: ```cpp void MainWindow::on_button_equal_clicked() { QString expression = ui->lineEdit_result->text(); QRegExp regex("([-+*/])"); QStringList numbers = expression.split(regex, QString::SkipEmptyParts); QStringList operators = expression.split(QRegExp("\\d+"), QString::SkipEmptyParts); double result = numbers.at(0).toDouble(); for (int i = 1; i < numbers.size(); i++) { if (operators.at(i - 1) == "+") { result += numbers.at(i).toDouble(); } else if (operators.at(i - 1) == "-") { result -= numbers.at(i).toDouble(); } else if (operators.at(i - 1) == "*") { result *= numbers.at(i).toDouble(); } else if (operators.at(i - 1) == "/") { result /= numbers.at(i).toDouble(); } } ui->lineEdit_result->setText(QString::number(result)); } ``` 这段代码将在等号按钮被点击时,解析表达式并进行相应的计算操作,并将计算结果显示在结果文本框中。 12. 在设计器中选择清除按钮,右键点击该按钮,选择"转到"。在弹出的对话框中选择"clicked()"信号,并点击"编辑"按钮。 13. 在编辑函数的窗口中,编写清除结果的函数实现。例如,可以将以下代码添加到函数中: ```cpp void MainWindow::on_button_clear_clicked() { ui->lineEdit_result->clear(); } ``` 这段代码将在清除按钮被点击时,清空结果文本框的内容。 14. 在设计器中选择每个操作符按钮,右键点击该按钮,选择"转到"。在弹出的对话框中选择"clicked()"信号,并点击"编辑"按钮。 15. 在编辑函数的窗口中,编写追加操作符的函数实现。例如,可以将以下代码添加到函数中: ```cpp void MainWindow::on_button_operator_clicked() { QPushButton *button = qobject_cast<QPushButton*>(sender()); if (button) { ui->lineEdit_result->setText(ui->lineEdit_result->text() + " " + button->text() + " "); } } ``` 这段代码将在操作符按钮被点击时,将操作符追加到结果文本框中。 完成上述步骤后,您可以运行程序并使用计算器界面进行加减乘除的计算操作。在每个按钮的右键菜单中选择"转到"可自动生成相应的函数,并与选定按钮的信号直接关联。 希望以上解释对您有所帮助!如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值