• 5061阅读
  • 7回复

QT 各个控件之间通信,正规的是要使用 event 吗? [复制链接]

上一主题 下一主题
离线cyberpunker
 

只看楼主 倒序阅读 楼主  发表于: 2014-05-22

  比如    mainwindow  中的一个控件,要控制mainwindow 的行为, 或者 mainwindow中的另外一个控件的行为,

   不要说 parentWidget() 函数了,可能控件的层次结构会很多层,用这个函数一层一层回退找没法弄,


   没有类似 MFC那样的获取 自身应用进程的 函数,然后挨个往下找? 当然这个也麻烦,头文件包含的问题



  


离线dbzhang800

只看该作者 1楼 发表于: 2014-05-22
简单地说,A要操作B的成员,A需要找到B的引用,一般,A中将B的引用作为一个成员保存,或者B通过全局的方式可以被访问。

实际中,又有很有变种,比如A可以访问C,而通过C可以访问B,你提到的就属于这种。

在Qt下,你可以获取顶层窗口,而后逐层往下找。找的过程中,你也可以根据名字直接找。这些东西,你翻翻QObject/QWidgt/QApplication的manual都能找到
离线cyberpunker

只看该作者 2楼 发表于: 2014-05-22
回 dbzhang800 的帖子
dbzhang800:简单地说,A要操作B的成员,A需要找到B的引用,一般,A中将B的引用作为一个成员保存,或者B通过全局的方式可以被访问。
实际中,又有很有变种,比如A可以访问C,而通过C可以访问B,你提到的就属于这种。
在Qt下,你可以获取顶层窗口,而后逐层往下找。找的过程中,你也可以根据 .. (2014-05-22 15:30)


  好吧,我问具体点:

一个mainwindow, 左边一列button, 右边是个 MDI , ( mdiarea  + mdisubwindow , 每个mdisubwindow里边放一个mdichild )

现在我鼠标关闭一个 mdisubwindow ,  导致对应的 mdichild 执行closeevent( ) , 那么我怎么去使得 mainwindow的 左边 的那一列中的 某个button 的状态改变呢?

用mdichild 可以使用 parentwidget 找到 mdisubwindow , 然后在往上就不太好弄了,



离线dbzhang800

只看该作者 3楼 发表于: 2014-05-22
你的mdichild创建时,你就可以让它把一些需要操作的对象的指针保存起来
离线kaon

只看该作者 4楼 发表于: 2014-05-22
connnect( sub, &QMdiSubwindow::close,[=](){this->yourbutton.changeStatus();});
乱写的
离线cyberpunker

只看该作者 5楼 发表于: 2014-05-22
回 dbzhang800 的帖子
dbzhang800:你的mdichild创建时,你就可以让它把一些需要操作的对象的指针保存起来 (2014-05-22 16:33) 


奇怪,这样的指针强制转换不行?

我在 mdichild 里存了个 QMdiArea 的指针, 然后:

MainWindow * p = (MainWindow *)mdiarea->parentWidget() ;

MainWindow * p = qobject_cast<MainWindow *>(mdiarea->parentWidget() );

MainWindow * p = dynamic_cast<MainWindow *>(mdiarea->parentWidget() );

得出的P 都不对啊,

离线彩阳

只看该作者 6楼 发表于: 2014-05-22
使用qobject_cast来代替dynamic_cast。
上海Qt开发联盟,热忱地欢迎你的加入!
离线cyberpunker

只看该作者 7楼 发表于: 2014-05-22
回 彩阳 的帖子
彩阳:使用qobject_cast来代替dynamic_cast。 (2014-05-22 17:19) 


上面有啊, p 得出为 0

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