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 用户界面。