找回密码
 立即注册
收起左侧

如何在提升后的widget中使用ui的问题

5
回复
7871
查看
[复制链接]
累计签到:85 天
连续签到:1 天
来源: 2017-11-22 10:32:38 显示全部楼层 |阅读模式
1Qter豆
我新建了一个C++的Class,继承自 QWidget然后将主窗口ui中的一个widget提升为这个Class
问题是在这个新建的类里怎么使用 ui 呢?
我获取主窗口指针
MainWindow*p=(MainWindow*)this->parent()->parent()->parent();然后发现 p->ui->XXXX 无法使用然后我将主窗口ui由private改成了public,如下private:    Ui::MainWindow *ui;改成public:   Ui::MainWindow *ui;
可是,p->ui->XXXX 还是无法使用。。。{:soso__13496012817283154022_2:}
是不是在提升后的 widget 中,只能自己在构造函数里 new 组件了?

最佳答案

查看完整内容

我的意思是如果在其它类中直接操作主窗口的ui违反了对象封装的原则。 如果非要做成与主窗口紧耦合的类,可以尝试使用友元,还有如果你要使用ui的话,注意要有
回复

使用道具 举报

累计签到:436 天
连续签到:1 天
2017-11-22 10:32:39 显示全部楼层
kenneth 发表于 2017-11-22 18:45
就是说,只能在主窗口的里操作主窗口的ui,而不能在其他类里面直接操作? ...

我的意思是如果在其它类中直接操作主窗口的ui违反了对象封装的原则。
如果非要做成与主窗口紧耦合的类,可以尝试使用友元,还有如果你要使用ui的话,注意要有
  1. #include "ui_mainwindow.h"
复制代码
回复

使用道具 举报

累计签到:436 天
连续签到:1 天
2017-11-22 14:49:35 显示全部楼层
如果你的意思是在该类里访问主窗口已有的ui控件,你应该从主窗口提供对应控件的访问接口,如
  1. Xxx* MainWindow::xxx() const
  2. {
  3.     return ui->xxx;
  4. }
复制代码

而不是随便跨越对象的访问控制。
回复

使用道具 举报

累计签到:85 天
连续签到:1 天
2017-11-22 18:45:33 显示全部楼层
miroox 发表于 2017-11-22 14:49
如果你的意思是在该类里访问主窗口已有的ui控件,你应该从主窗口提供对应控件的访问接口,如

而不是随便跨 ...

就是说,只能在主窗口的里操作主窗口的ui,而不能在其他类里面直接操作?

点评

我的意思是如果在其它类中直接操作主窗口的ui违反了对象封装的原则。 如果非要做成与主窗口紧耦合的类,可以尝试使用友元,还有如果你要使用ui的话,注意要有  详情 回复 发表于 2017-11-22 23:01
回复

使用道具 举报

累计签到:35 天
连续签到:1 天
2017-11-22 20:14:40 显示全部楼层
kenneth 发表于 2017-11-22 18:45
就是说,只能在主窗口的里操作主窗口的ui,而不能在其他类里面直接操作? ...

Qt本身是一个以MainWindow为GUI的体系,而且默认为主线程,大部分程序都是它的“下级”而不是“上级”,但这并非代表主窗口不能响应下级(你要相信c++什么都能做,更何况这个)。可以借助qt的信号与槽来完成
回复

使用道具 举报

累计签到:85 天
连续签到:1 天
2017-11-22 21:19:15 显示全部楼层
我现在想通了,完全用ui设计器搭界面也不太现实啊,ui设计器用在简单的对话框程序上确实很简便,但在复杂的多层框架的界面上,还不如自己写代码new组件,然后写connect连接信号槽简单呢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了