理解信号和槽(一)

槽和信号术语

槽是标准的成员函数(作为类成员的函数)能够连接到信号,每当槽所连接的信号被发射时,槽(函数)就被执行

许多Qt类已经包含一些程序中可以使用的预定义槽。例如,QPushButton类所包含的clicked()函数

信号也是成员函数,当对象内部状态发生改变时发出信号。信号连接到槽,那么槽(函数)就被执行。可以将多个槽连接到同一个信号,这些槽会被依次执行,其执行顺序是任意的。

#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QFont>
#include <QLCDNumber>
#include <QSlider>
class MyMainWindow : public QWidget
{
public:
    MyMainWindow();
private:
    QPushButton *b1;
    QLCDNumber *lcd;
    QSlider *slider;
};

MyMainWindow::MyMainWindow()
{
    setGeometry(100, 100, 300, 200);
    b1 = new QPushButton("Quit", this);
    b1->setGeometry(10, 10, 80, 40);
    b1->setFont(QFont("Times", 18, QFont::Bold));

    lcd = new QLCDNumber(2, this);
    lcd->setGeometry(100, 10, 190, 180);

    slider = new QSlider(Qt::Vertical, this);
    slider->setGeometry(10, 60, 80, 130);
    //b1的clicked()信号连接到qApp的quit()槽。其结果导致点击b1时,程序退出
    //slider的valueChanged()信号被连接到lcd的display()槽,一个int值在两个函数之间传递。这使得通过拖动滑块能够控制显示中所显示的数值
    connect(b1, SIGNAL(clicked()), qApp, SLOT(quit()));
    connect(slider, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)));
}

int main(int argc, char **argv)
{
    QApplication a(argc, argv);
    MyMainWindow w;
    w.show();
    return a.exec();
}
#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QFont>
#include <QLineEdit>
#include <QString>

class MyMainWindow : public QWidget
{
public:
    MyMainWindow();
private:
    QPushButton *b1;
    QPushButton *b2;
    QPushButton *b3;
    QLineEdit *ledit;
};

MyMainWindow::MyMainWindow()
{
    setGeometry(100, 100, 300, 200);
    b1 = new QPushButton("Click here to mark the text", this);
    b1->setGeometry(10, 10, 280, 40);
    b1->setFont(QFont("Times", 18, QFont::Bold));

    b2 = new QPushButton("Click here to unmark the text", this);
    b2->setGeometry(10, 60, 280, 40);
    b2->setFont(QFont("Times", 18, QFont::Bold));

    b3 = new QPushButton("Click here to remove the text", this);
    b3->setGeometry(10, 110, 280, 40);
    b3->setFont(QFont("Times", 18, QFont::Bold));

    ledit = new QLineEdit("This is a line of text", this);
    ledit->setGeometry(10, 160, 280, 30);
    connect(b1, SIGNAL(clicked()), ledit, SLOT(selectAll()));
    connect(b2, SIGNAL(clicked()), ledit, SLOT(deselect()));
    connect(b3, SIGNAL(clicked()), ledit, SLOT(clear()));
}

int main(int argc, char **argv)
{
    QApplication a(argc, argv);
    MyMainWindow w;
    w.show();
    return a.exec();
}

为了完全理解信号和槽,应该理解这几个术语

术语 解释
用户事件 指程序的用户所产生的事件。例如,点击鼠标或拖动滚动条
程序事件 指程序所产生的事件。例如,当用户点击鼠标后程序退出
发射信号 基本意思是指“发出”一个信号。例如,当你点击鼠标时,将发射clicked()信号。为了发射信号,使用emit关键字
内部状态 当谈论信号时。你可能听说过“内部状态已经改变”这意味着对象内部数据已发生改变,因此对象发射一个信号
MOC 元对象编译器用于构造用户自己的信号和槽。它处理Qt特有的关键字(例如emit),创建合法的C++代码。
posted @ 2021-05-25 21:12  朱元叹  阅读(237)  评论(0)    收藏  举报