• 2667阅读
  • 21回复

请问关于qt控件管理的问题 [复制链接]

上一主题 下一主题
离线lihybn
 

只看楼主 倒序阅读 楼主  发表于: 2018-07-30
请问各位大神,当控件太多嵌套层数太多的时候,你们是怎么管理的呢。
如图所示,假如我要做这么一个复杂的界面,用代码写,不用设计师设计。
假如B区的E控件状态变化,会使C区内的某些button变化。
这么多层的控件,如何做才能更好的管理控件、连接信号槽呢。

离线iceroad

只看该作者 1楼 发表于: 2018-07-30
逐层封装
离线lihybn

只看该作者 2楼 发表于: 2018-07-30
回 iceroad 的帖子
iceroad:逐层封装 (2018-07-30 16:42)

逐层封装会遇到一个比较麻烦的问题,就是需要写的函数太多,比如我想让E按钮隐藏,需要在A、B、D三个类中各写一个setHide函数。我想从C中的部件给E发信号,也会发好几层,主要就是有点愁这个事
离线fu22507411

只看该作者 3楼 发表于: 2018-07-31
弄一个通知中心的单例来发信号就行了
邮箱jiahao_coffee@foxmail.com 有问题可以免费咨询,有空都会回答,不过太难了我答不上来不要介意哈
离线lihybn

只看该作者 4楼 发表于: 2018-07-31
回 fu22507411 的帖子
fu22507411:弄一个通知中心的单例来发信号就行了 (2018-07-31 01:38) 

有点不太明白,麻烦能不能稍微详细说一下
离线iceroad

只看该作者 5楼 发表于: 2018-07-31
逐层封装 是必须的,
至于消息传递,用3楼的方法,用 单例 进行消息中转
也可以用Qt的事件投递
离线lihybn

只看该作者 6楼 发表于: 2018-07-31
回 iceroad 的帖子
iceroad:逐层封装 是必须的,
至于消息传递,用3楼的方法,用 单例 进行消息中转
也可以用Qt的事件投递
 (2018-07-31 09:42) 

大神,用 单例 进行消息中转 能不能麻烦说的详细一点,听不太明白
离线iceroad

只看该作者 7楼 发表于: 2018-07-31
要不就用事件传递吧,给你个链接
https://blog.csdn.net/Amnes1a/article/details/64906910
离线iceroad

只看该作者 8楼 发表于: 2018-07-31
单例传递 类似于实现一个  系统托盘菜单的东西 ,这个东西是全局的。 所有的消息都通过他来中转,
A------>通知系统托盘菜单,
系统托盘菜单通知 ------->B

不如直接使用 Qt事件投递 简单
离线lihybn

只看该作者 9楼 发表于: 2018-07-31
回 iceroad 的帖子
iceroad:单例传递 类似于实现一个  系统托盘菜单的东西 ,这个东西是全局的。 所有的消息都通过他来中转,
A------>通知系统托盘菜单,
系统托盘菜单通知 ------->B
不如直接使用 Qt事件投递 简单 (2018-07-31 11:00) 

好的,太感谢你了,我研究研究,我这项目还没开始,预感到会出现这个尴尬的问题,又想不明白怎么解决,就过来问了一下
离线fu22507411

只看该作者 10楼 发表于: 2018-08-04
如果不需要跨进程间通信的话,我推荐用通知中心
class NoticeCenter:public QObject
{
static NoticeCenter::getInstance();
...
signals:
void mysignal(QString);
};
cpp:

NoticeCenter*NoticeCenter::getInstance()
{
static NoticeCenter * g_instance = NULL;
//如果这个通知类会被不同的线程调用最好上锁
if(g_instance == NULL)
{
g_instance  = new NoticeCenter ();
}
return g_instance;
}
在A控件类中发信号

NoticeCenter::getInstance()->mysignal("A_var");//这个用法Qt4可能不支持
在B控件类中接收
B
{
connect(NoticeCenter::getInstance(),SIGNAL(QString),this,SLOT(bSlotFun(QString)));
}
void B:bSlotFun(QString var)
{
var;//var="A_var"
}





邮箱jiahao_coffee@foxmail.com 有问题可以免费咨询,有空都会回答,不过太难了我答不上来不要介意哈
离线lihybn

只看该作者 11楼 发表于: 2018-08-13
回 fu22507411 的帖子
fu22507411:如果不需要跨进程间通信的话,我推荐用通知中心
class NoticeCenter:public QObject
{
static NoticeCenter::getInstance();
...
....... (2018-08-04 03:02) 

谢谢,过几天我试试,现在还没开始,未雨绸缪太久了
离线lihybn

只看该作者 12楼 发表于: 2018-08-13
回 fu22507411 的帖子
fu22507411:如果不需要跨进程间通信的话,我推荐用通知中心
class NoticeCenter:public QObject
{
static NoticeCenter::getInstance();
...
....... (2018-08-04 03:02) 

太感谢了,我明白你的意思啦,这思路真好
离线lihybn

只看该作者 13楼 发表于: 2018-08-13
回 fu22507411 的帖子
fu22507411:如果不需要跨进程间通信的话,我推荐用通知中心
class NoticeCenter:public QObject
{
static NoticeCenter::getInstance();
...
....... (2018-08-04 03:02) 

大神,假如我点E的时候需要获取C区某个lineedit的文本或者button的状态,你感觉怎么写比较好呢
离线fu22507411

只看该作者 14楼 发表于: 2018-08-13

你现在已经掌握了单例
除了通知中心,你还可以弄个数据中心DataCenter的单例,把需要共享数据的控件注册到DataCenter中。
像这样
class DataCenter
{
QSet<QLineEdit*>m_lineEdits;
static void registerLineEdit(QLineEdit * );
}
void DataCenter::registerLineEdit(QLineEdit *lineEdit )
{
getInstance()->m_lineEdits<<lineEdit ;
}

在class E中

{
DataCenter::registerLineEdit(ui.lineEdit);
}
要用的时候再从DataCenter拿出来
邮箱jiahao_coffee@foxmail.com 有问题可以免费咨询,有空都会回答,不过太难了我答不上来不要介意哈
离线lihybn

只看该作者 15楼 发表于: 2018-08-14
回 fu22507411 的帖子
fu22507411:你现在已经掌握了单例
除了通知中心,你还可以弄个数据中心DataCenter的单例,把需要共享数据的控件注册到DataCenter中。
像这样
class DataCenter
....... (2018-08-13 19:59) 

大神,还有个疑问想问一下,如果把所有的控件都放到数据中心,是不是消息中心也可以省了。。。 数据中心会不会影响封装啥的,我是个菜鸡,不是挑刺
离线fu22507411

只看该作者 16楼 发表于: 2018-08-14
回 lihybn 的帖子
lihybn:大神,还有个疑问想问一下,如果把所有的控件都放到数据中心,是不是消息中心也可以省了。。。 数据中心会不会影响封装啥的,我是个菜鸡,不是挑刺[表情] (2018-08-14 10:12) 

代码逻辑清晰就好
邮箱jiahao_coffee@foxmail.com 有问题可以免费咨询,有空都会回答,不过太难了我答不上来不要介意哈
离线lihybn

只看该作者 17楼 发表于: 2018-08-14
回 fu22507411 的帖子
fu22507411:代码逻辑清晰就好 (2018-08-14 10:15) 

好的,太感谢你了。,大神,麻烦再问一下,这种复杂界面的编程有没有什么书或者开源代码推荐一下啊,我在git上也没找到太合适的,可能英语不太好
离线fu22507411

只看该作者 18楼 发表于: 2018-08-15
回 lihybn 的帖子
lihybn:好的,太感谢你了。[表情],大神,麻烦再问一下,这种复杂界面的编程有没有什么书或者开源代码推荐一下啊,我在git上也没找到太合适的,可能英语不太好 (2018-08-14 10:41) 

一般情况下不这么写代码,界面的逻辑和数据最好是分开的。
邮箱jiahao_coffee@foxmail.com 有问题可以免费咨询,有空都会回答,不过太难了我答不上来不要介意哈
离线lihybn

只看该作者 19楼 发表于: 2018-08-16
回 fu22507411 的帖子
fu22507411:一般情况下不这么写代码,界面的逻辑和数据最好是分开的。 (2018-08-15 20:54) 

太感谢你了,假如数据不多的话,我打算给每个控件写个get函数,这样我感觉可能会写很多。如果太多可能就麻烦了
离线fu22507411

只看该作者 20楼 发表于: 2018-08-16
回 lihybn 的帖子
lihybn:太感谢你了,假如数据不多的话,我打算给每个控件写个get函数,这样我感觉可能会写很多。如果太多可能就麻烦了 (2018-08-16 10:27) 

尽量还是把数据统一的管理起来好。读写都用一个类来操作。当数据有变化的时候,数据中心发送更新信号,connect了更新信号的界面类去更新界面中的控件。这样实现逻辑清晰易于管理,会好很多。
邮箱jiahao_coffee@foxmail.com 有问题可以免费咨询,有空都会回答,不过太难了我答不上来不要介意哈
离线lihybn

只看该作者 21楼 发表于: 2018-08-17
回 fu22507411 的帖子
fu22507411:尽量还是把数据统一的管理起来好。读写都用一个类来操作。当数据有变化的时候,数据中心发送更新信号,connect了更新信号的界面类去更新界面中的控件。这样实现逻辑清晰易于管理,会好很多。 (2018-08-16 21:15) 

好的谢谢
快速回复
限100 字节
 
上一个 下一个