Qt中界面与界面的通信方式

Qt中经常会碰到界面和界面之间的通信,借着这个机会,就将常见的几种方式总结一下。
常用的方式:

  • 信号和槽
  • 全局变量
  • 文件
  • 静态函数 + 仿单例

以下就详细介绍一下。

1. 信号和槽

信号和槽可以说是Qt的精髓了,其本质实际上就是回调函数,具体的使用其实比较简单,只要能找到对应窗口的句柄,以及其发射的信号,或者是接收的槽,就可以实现界面与界面之间的通信。
因为比较简单,这里就不多加赘述。

2. 全局变量

对于全局变量,本人是又爱又恨。

在恰当使用全局变量的时候,可以实现代码量的大量简化,这是我喜欢它的点。
但是因为一旦使用不当,那可以称之为灾难。
另一方面,对于面向对象语言而言,全局变量也是破坏了其自身的封装性,于其根本思想不符。

因此对于全局变量,个人的建议是慎用,非必要不采用。

3. 文件

对于文件,我实在是没什么多说的了,基本思想与全局变量类似,都是共同操作一个可以互相看到的东西。
另文件也可用于进程间的通信。

4. 静态函数 + 仿单例

这一种方法在进行界面与弹窗之间的通信的时候,极其好用,这也是我在本篇博客中着重需要介绍的一个东西。

在我看Qt源码的过程中,我发现了这种极其特殊的写法,其中主要使用到的是static静态函数以及QPointer智能指针。

其基本思想是:
通过在static静态函数内进行一个仿单例的方式,创建出一个其自身的对象指针,通过其自身的一下操作(包括调用自身的函数),返回需要的值(比如说计算的值、界面的数据等)。
然后又因为这个指针的存放方式是智能指针,这样就不需要人工去删除这个对象。

话不多说,上一段代码,这一段代码的目的是获得这个自定义的弹窗界面中的用户和密码数据。

class FrmUpdateOrRegister : public QDialog
{
	Q_OBJECT

public:
	FrmUpdateOrRegister(QWidget *parent = Q_NULLPTR);
	~FrmUpdateOrRegister();

public:
	///< 这个是我们的注册函数(返回值为 “账户 + 密码” 的一个链表)
	static QStringList registerUser();

private:
	QString getPassword() const;
	
	QString getUsername() const;

private:
	Ui::FrmUpdateOrRegister ui;
};
QStringList FrmUpdateOrRegister::registerUser()
{
	QPointer<FrmUpdateOrRegister> dlg = new FrmUpdateOrRegister;
	
	if (!dlg.isNull())
	{
		if (QDialog::Accepted = dlg->exec())
		{
			QStringList list;
			list << dlg->getUsername()
				 << dlg->getPassword();

			return list;
		}
		
		return QStringList();
	}

	return QStringList();
}

QString FrmUpdateOrRegister::getPassword() const
{
	return ui.passwordEdt->text();
}

QString FrmUpdateOrRegister::getUsername() const
{
	return ui.userNameEdt->text();
}

在使用的时候,只需要调用这个类的静态函数即可,就会跳出弹窗,并且在关闭弹窗的时候返回需要的值。
如下所示:

auto list = FrmUpdateOrRegister::registerUser();

这种方式为我们获得弹窗上的数据提供了一个非常另类且好用的方式,以往如果想要获得弹窗的数据,我一般都是采用信号和槽的方式,但是使用信号和槽的时候,每次使用都要实例化一个弹窗,并且这个信号和槽的连接在需要获得的数据种类比较多的情况下(就是需要发送多个信号),往往也是搞的烦不胜烦。
但是如果采用这种方式,那么只需要在弹窗类中自定义好接口之后,就可以像普通的函数调用的方式去调用了,而不需要进行复杂的信号和槽的连接。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值