ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 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 用户界面。