本文介绍Qt窗体间值的传递方法。
基于图形窗口的应用程序在执行过程中,有时候会涉及到窗口间传递数据,如常见的父窗口-子窗口间,子窗口-子窗口间,传递数据的方式有多种,常见的有通过全局变量,静态变量,消息,获取父窗口指针等方式,本文介绍常用的2种,通过消息和获取父窗口指针的方法。
1.获取父窗口指针
此方法仅适用与父窗口-子窗口间的值的传递。对于Qt而言,子窗口获取父窗口指针的方法:
QWidget *QWidget::parentWidget() const
操作步骤:
1)分别在父,子窗口定义需要传值的public函数
如:
父窗口内函数定义:
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
public:
void setValue(int v);
int getValue(void);
private:
Ui::MainWindow *ui;
int a;
private:
void onPushButton(void);
};
子窗口内函数定义:
class Dialog : public QDialog
{
Q_OBJECT
public:
explicit Dialog(QWidget *parent = nullptr);
~Dialog();
public:
void setValue(int v);
int getValue(void);
private:
Ui::Dialog *ui;
int a;
private:
void onPushButton(void);
};
2)值传递
在父窗口实例化子窗口后,可以通过子窗口指针调用setValue()和getValue()函数获取子窗口值,子窗口内可以通过parentWidget()函数获取父窗口指针,进而调用父窗口的setValue()和getValue()函数,从而达到双向值的传递。
如子窗口内:
void Dialog::onPushButton()
{
MainWindow *widget = nullptr;
widget = static_cast<MainWindow *>(QWidget::parentWidget());
widget->setValue(6);
}
2.消息传递
对于Qt,这里的消息传递就是指通过信号和槽的机制来实现值的传递。
操作步骤:
1)分别在父,子窗口定义信号和槽函数
如:
父窗口内函数定义:
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
public slots:
void slotSetValue(int v);
void slotGetValue(void);
void slotValue(int v);
signals:
void sgnGetValue(void);
void sgnSetValue(int v);
void sgnValue(int v);
private:
Ui::MainWindow *ui;
int a;
private:
void onPushButton(void);
};
子窗口内函数定义:
class Dialog : public QDialog
{
Q_OBJECT
public:
explicit Dialog(QWidget *parent = nullptr);
~Dialog();
public slots:
void slotSetValue(int v);
void slotGetValue(void);
void slotValue(int v);
signals:
void sgnGetValue(void);
void sgnSetValue(int v);
void sgnValue(int v);
private:
Ui::Dialog *ui;
int a;
private:
void onPushButton(void);
};
2)建立连接
如父窗口内:
void MainWindow::onPushButton()
{
Dialog *dialog = new Dialog(this);
connect(dialog, &Dialog::sgnGetValue, this, &MainWindow::slotGetValue);
connect(dialog, &Dialog::sgnSetValue, this, &MainWindow::slotSetValue);
connect(dialog, &Dialog::sgnValue, this, &MainWindow::slotValue);
connect(this, &MainWindow::sgnGetValue, dialog, &Dialog::slotGetValue);
connect(this, &MainWindow::sgnSetValue, dialog, &Dialog::slotSetValue);
connect(this, &MainWindow::sgnValue, dialog, &Dialog::slotValue);
Q_EMIT sgnSetValue(3);
dialog->exec();
}
这样,父,子窗口根据相应的信号和槽建立的联系,进而实现了值的传递。
总结,本文介绍了Qt窗体间值的传递的2种方法。