在用Qt编写弹窗(dialog)的过程中,使用d指针和q指针可以让代码更加安全和灵活。下面是一个简单的例子:
#include <QDialog>
#include <QPushButton>
class MyDialog : public QDialog {
public:
explicit MyDialog(QWidget *parent = nullptr);
private:
QPushButton *m_okButton; // 指向确定按钮的q指针
QPushButton *m_cancelButton; // 指向取消按钮的q指针
private slots:
void on_okButton_clicked();
void on_cancelButton_clicked();
};
MyDialog::MyDialog(QWidget *parent) : QDialog(parent) {
// 创建两个按钮,并放到水平布局中
m_okButton = new QPushButton("OK", this);
m_cancelButton = new QPushButton("Cancel", this);
QHBoxLayout *buttonLayout = new QHBoxLayout(this);
buttonLayout->addWidget(m_okButton);
buttonLayout->addWidget(m_cancelButton);
// 连接信号槽
connect(m_okButton, SIGNAL(clicked()), this, SLOT(on_okButton_clicked()));
connect(m_cancelButton, SIGNAL(clicked()), this, SLOT(on_cancelButton_clicked()));
}
void MyDialog::on_okButton_clicked() {
// 处理确定按钮被点击后的逻辑
accept(); // 关闭对话框并返回QDialog::Accepted
}
void MyDialog::on_cancelButton_clicked() {
// 处理取消按钮被点击后的逻辑
reject(); // 关闭对话框并返回QDialog::Rejected
}
在这个例子中,我们创建了一个继承自QDialog的MyDialog类,其中包含了两个QPushButton类型的q指针:m_okButton和m_cancelButton。我们使用这两个指针来访问“OK”和“Cancel”按钮,以便在后续的代码中对它们进行操作。
另外,我们还使用了accept()和reject()函数来关闭对话框并设置返回值。这两个函数在QDialog类中定义,可以方便地将对话框的结果传递给调用者。
需要注意的是,为了保证代码的安全性,我们还应该使用d指针来访问对话框的私有成员变量。例如,如果我们要在MyDialog类的构造函数中设置一些私有成员变量,可以使用以下方式:
MyDialog::MyDialog(QWidget *parent) : QDialog(parent), d_ptr(new MyDialogPrivate(this)) {
Q_D(MyDialog); // 定义d指针
// 设置一些私有成员变量
d->m_data = 42;
d->m_foo = "bar";
}
在这段代码中,我们首先创建一个名为d_ptr的指向MyDialogPrivate类的d指针,并在构造函数中使用new运算符对其进行初始化。然后,在构造函数的最后一行,我们使用Q_D宏来定义d指针,并通过d指针来访问私有成员变量。这样做的好处是,即使在MyDialogPrivate类的实现发生变化时,也不会影响到MyDialog类的接口,从而提高了代码的可维护性和扩展性。