10.5 信号与槽的自动连接

信号与槽可以通过使用手写代码显式的实现关联 ,也可以运用 QMetaObject 类规定的槽 函数命名范式来实现自动关联。

10.5.1 显式关联

首先我们来看一下,不使用“自动关联规则”的情形。

在下面这段代码里面,我们定义了一个对话框类,它有一个私有的槽 checkValues(), 它用来检验用户提供的值是否正确。

class ImageDialog : public QDialog, private Ui::ImageDialog
{
    Q_OBJECT
public:
    ImageDialog(QWidget *parent = 0);
private slots:
    void checkValues();
};

在这个对话框类的构造函数中,我们把 Cancel 按钮的 clicked()信号与对话框类的 reject()槽关联起来,把 OK 按钮的 clicked()信号与对话框类的 checkValues()槽关联起来, 这都是通过手写代码显式的实现的。

ImageDialog::ImageDialog(QWidget *parent)
: QDialog(parent)
{
    setupUi(this);
    okButton->setAutoDefault(false);
    cancelButton->setAutoDefault(false);
    ...
    connect(okButton, SIGNAL(clicked()), this, SLOT(checkValues()));
}
void ImageDialog::checkValues()
{
    if (nameLineEdit->text().isEmpty())
    {
        (void) QMessageBox::information(this, tr("No Image Name"),
        tr("Please supply a name for the image."), QMessageBox::Cancel);
    }
    else
    {
        accept();
    }
}

10.5.2 自动关联

下面的例子演示了信号与槽自动关联的具体实现过程 。我们只需按照下面的标准格式定 义槽函数,这之后,uic 将会根据 QMetaObject 类制定的规则,生成界面实体类的 setupUi() 函数的内容,并完成信号与槽的关联,这一过程是隐藏在背后实现的,我们也无需过多关心。

void on_<object name>_<signal name>(<signal parameters>);

我们通过定义私有槽函数 on_okButton_clicked()即实现了 OK 按钮的 clicked()信号和槽的连接。

class ImageDialog : public QDialog, private Ui::ImageDialog
{
    Q_OBJECT
public:
    ImageDialog(QWidget *parent = 0);
private slots:
    void on_okButton_clicked();
};

信号与槽的自动连接机制提供了一种槽函数的命名范式,它简化了程序设计者的工作 ,使得用户界面设计变得有章可循并且充满乐趣。笔者建议读者朋友尽量采用这种方法来设 计 Qt 用户界面。