• 6566阅读
  • 9回复

[提问]How:有模态子窗口时,父窗口上的一个按钮仍可被点击 [复制链接]

上一主题 下一主题
离线mpcrm
 
只看楼主 正序阅读 楼主  发表于: 2013-04-01
有一个需求是,在任何时候,父窗口上的一个按钮都是可被点击的,也就是,即便有模态子窗口正在显示,这个按钮也得可以点击。


试了下 在一个总是最前显示的非模态子窗口上放这个按钮,也不行,有模态子窗口时,这个按钮还是不能点击

一个想法是:进程A的UI上没有这个按钮,另加一个进程B,他的UI上只有一个按钮,且是最前显示的,这样按钮看起来就好像是在进程A的ui上,且总是可以点击的,点击后通过进程间通讯告知进程A……但不想用这种方式


请问有什么解决办法吗?谢谢!
离线mpcrm
只看该作者 9楼 发表于: 2013-04-02
好吧,看来只能曲线救国,谢谢各位了!
离线jdwx

只看该作者 8楼 发表于: 2013-04-01
有模态子窗口显示的时候,父窗口是无法获取键盘和鼠标输入的。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线ffii4455

只看该作者 7楼 发表于: 2013-04-01
回 6楼(mpcrm) 的帖子
刚才说错了,子线程里无法获取到任何事件。。。看来你只能用winAPI来获取全局鼠标坐标再推算了。。。
离线mpcrm
只看该作者 6楼 发表于: 2013-04-01
回 5楼(ffii4455) 的帖子
如何在有模态子窗口显示的情况下,在父窗口中响应全局鼠标点击事件和位置呢?

我有个疑问一直不清楚,看一些博文,说的是模态子窗口有事件循环,它会阻塞父窗口的事件循环,好像父窗口不能处理消息和事件一样,但从实际看,在有模态子窗口显示的情况下,父窗口仍能处理paintEvent(软件的波形一直在实时刷新)。

可能是我的理解不对,反正一直没搞明白
离线ffii4455

只看该作者 5楼 发表于: 2013-04-01
回 4楼(mpcrm) 的帖子
我的意思是你在模态下的这种需求很奇怪。
想在模态下实现直接实现的可能性很低,除非从操作系统的底层来看。
不过要是间接的话,用你上面的进程可以实现,不必用两套UI,只需要进程B实现一个按钮,通过通信始终在进程A主窗口上的某一位置就行。

还有一个办法就是另开一个线程,在这个线程上检测鼠标事件。我没有试过能不能在已经弹出一个模态窗口的情况下通过其他线程触发父窗口的槽函数
来获取鼠标点击位置。
如果不行的话,全局鼠标位置一定是可以获取到的,你可以在模态窗口弹出前获得主窗口pos,然后进行推算。
离线mpcrm
只看该作者 4楼 发表于: 2013-04-01
引用第2楼ffii4455于2013-04-01 13:45发表的  :
这是什么奇怪的需求?
目前已有的软件上有这种实现吗?
模态窗口本身就是禁止用户在模态窗口关闭前去操作其父窗口。


这种需求不奇怪的,比如医疗软件,根据法规要求,在任何情况下,Emergency(紧急)按钮都是可点击的,当然,软件已崩溃、卡死的情况下就不用考虑了……
离线mpcrm
只看该作者 3楼 发表于: 2013-04-01
Re:回 楼主(mpcrm) 的帖子
引用第1楼jdwx于2013-04-01 13:44发表的 回 楼主(mpcrm) 的帖子 :
这个需求用模态对话框本身就是矛盾,
还是改用非模态对话框,把主界面上的其它控件setEnabled(false);
或者把这个按钮放到对话框上。

谢谢!
这个方法理论上是不错的,但是我现在是在别人已经做得很多的基础上做得,界面比较复杂,子窗口也很多,最初的人根本没有考虑这个需求,现在再按这个方法做的话……会比较麻烦一些
离线ffii4455

只看该作者 2楼 发表于: 2013-04-01
这是什么奇怪的需求?
目前已有的软件上有这种实现吗?
模态窗口本身就是禁止用户在模态窗口关闭前去操作其父窗口。
离线jdwx

只看该作者 1楼 发表于: 2013-04-01
回 楼主(mpcrm) 的帖子
这个需求用模态对话框本身就是矛盾,
还是改用非模态对话框,把主界面上的其它控件setEnabled(false);
或者把这个按钮放到对话框上。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
快速回复
限100 字节
 
上一个 下一个