• 9475阅读
  • 8回复

[提问]QInputpanel的对象为什么在QDialog对象的界面下面,如何解决 [复制链接]

上一主题 下一主题
离线7048796
 

只看楼主 倒序阅读 楼主  发表于: 2011-08-30
小弟近来在用QtCreater学习软键盘输入法,学习的例子是Qt4.7源码/QtSDK/Example/4.7/tools/inputpanel,里面提供了,一个很好的输入法软键盘实现类,继承自QInputContext,但在学习过程中,发现,如果界面那里,使用QDialog类,就会出现,输入面板的界面,在后面的情况?请问,有没人可以讨论一下这个情况呢?如何解决?若使用QWidget,输入面板的界面,可以在上面的,QDialog是继承自QWidget的,对于这个,真是很不明白了
离线7048796

只看该作者 1楼 发表于: 2011-08-30
在论坛里进行了搜索,从这里 http://www.qtcn.org/bbs/read-htm-tid-44565.html启发一下,在触发面板显示的代码里面加入 inputPanel->setWindowFlags(Qt::Dialog); 可以让输入面板出现在QDialog上面了~~  
在文件 myinputpanelcontext.cpp 里面,代码修为:
....
if (event->type() == QEvent::RequesSoftWareInputPanel ){
     updatePosition();
     inputPanel->setWindowFlags(Qt:: Dialog);
     inputPanel-> show();
     return true;
}
........
离线7048796

只看该作者 2楼 发表于: 2011-08-30
在这里再进一步,在原来的QDialog 的下面,再建另一个QDialog , 用QPushButton(即按键),信号槽,调用新的QDialog,发现,原来的问题还是没有很好地解决掉,还出现了,点击输入面板,没有发应的新问题了。
按键信号槽:
void  TestDialog:: on_pushButton_clicked( )
{
          SecondDialog  seconddialog;  //第二个QDialog
          seconddialog.exec( );
}
........................
论坛里的大大们,可以指点一下不?
离线wxj120bw

只看该作者 3楼 发表于: 2011-08-30
回 2楼(7048796) 的帖子
也许第二个对话框可不生成在第一个对话框里面
离线7048796

只看该作者 4楼 发表于: 2011-08-30
经过测试,点击输入面板,没有发应的问题,是由QDialog.exec()引起的~~
故切入点还是它。


看QT帮助手册:
int QDialog::exec() [slot]
Shows the dialog as a modal dialog, blocking until the user closes it .The function returns a DialogCode result.
if the dialog is application modal,users cannot interact with any other window in the same applicatio until they close the dialog. if the dialog is window modal,only interaction with the parent window is blocked while the dialog is open. By default, the dialog is application modal.
See also open() ,show(),result(),and setWindowModality().


从上面,可以看出QDialog默认为application modal,而要使用输入法,必有“interaction with the parent window is blocked while the dialog is open”,故使用setWindowModality(Qt::WindowModal),就可以使用输入法了。
故原来的代码改为:
........
     SecondDialog seconddialog;
     seconddialog.setWindowModality(Qt::WindowModal);
     seccondialog.exec();
........
离线7048796

只看该作者 5楼 发表于: 2011-08-30
谢谢三楼的关注与回答,之所以第二框生成于第一个框里面,主要是考虑到,实际的使用中,也会存在多个QDialog互相调用的情况。  同时,这样生成也是一方面考虑到,在槽函数里面生成的对象,可以很自然地在槽函数调用后,进行自动析构。对内存管理有好处。
离线wxj120bw

只看该作者 6楼 发表于: 2011-08-31
回 5楼(7048796) 的帖子
看楼主的分析 自己也受益匪浅
离线atgjlc
只看该作者 7楼 发表于: 2012-07-17
我现在也遇到这个问题,刚接触QT,还希望楼主指教一下。我有两个Dialog希望两个都可以用,但是和你的一样,第二个的时候点击没反应,还有一个问题就是我想加按钮clear ,delete,点 这三个按钮,结果点击任一个按钮完全没反应,关闭也不可以。这是为什么?
现在就剩努力!
离线netcalf

只看该作者 8楼 发表于: 2012-09-21
Re:回 5楼(7048796) 的帖子
引用第6楼wxj120bw于2011-08-31 00:02发表的 回 5楼(7048796) 的帖子 :
看楼主的分析 自己也受益匪浅 [表情]  

同感,我也碰到了类似问题,看楼主帖子解决了
快速回复
限100 字节
 
上一个 下一个