• 11521阅读
  • 10回复

重新修正:QT的多窗口之间传递信号的问题 [复制链接]

上一主题 下一主题
离线sd菜
 
只看楼主 倒序阅读 楼主  发表于: 2010-09-12
我刚开始学QT,现在在弄一个类型WIN7的桌面便贴的小软件,一共就两个窗口,一个主窗口和一个子窗口(弹出的警告窗口),就是想在点击主窗口的删除按钮时弹出子窗口后,我点击主窗口的关闭按钮(程序退出)时子窗口会闪两下提示还有问题未解决,同时主窗口不能关闭,必须将子窗口关闭后才能关闭主窗口,这个信号与槽机制该怎么写,另外,我有两个头文件,能将里面的类提到一个头文件里面吗?(为了防止重复包含的),主要是那个代码怎么写啊???

对于这个问题:在多窗口(2个及2个以上)切换问题(每次只能显示一个问题,当然,模态窗口除外),通过点击按钮来到下一个窗口或者是返回之前的窗口,可以在鼠标点击事件中,new出下一个窗口,并show,该窗口则hide,同时在该函数里连接一个信号与槽,接收另一个窗口关闭时发出的信号并显示出来,代码如下:
要在A中点击按钮切换成B窗口
A.h
前置申明类B:class B;
public中:申明指针B *b;
A.cpp
包含B的头文件
void Start::on_bBtn_clicked()
[pre]{[/pre][pre] b=new B;[/pre][pre] b->show();[/pre][pre] this->hide();[/pre][pre] QObject::connect(b,SIGNAL(b_closed()),this,SLOT(show()));[/pre][pre]}[/pre][pre]B.cpp[/pre][pre]void B::on_bBtn_clicked()[pre]{[/pre][pre] emit b_closed();[/pre][pre] this->close();[/pre][pre]}[/pre][pre]这样通过发送信号给A,A在接收到该信号时就显示出来了,完成了切换,多窗口同样适用,QT的信号与槽机制确实很灵活~~~[/pre][/pre]
[ 此帖被sd菜在2010-10-24 16:13重新编辑 ]
离线roywillow

只看该作者 1楼 发表于: 2010-09-12
或许可以在主窗口的closeEvent中进行判断?
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线sd菜
只看该作者 2楼 发表于: 2010-09-12
回 1楼(roywillow) 的帖子
是在这个void Widget::changeEvent(QEvent *e)里面写吗还是另外加一个函数closeEvent来写啊?
离线sd菜
只看该作者 3楼 发表于: 2010-09-12
我找到了一个代码是判断窗口能否关闭的:

如果在窗体关闭前自行判断是否可关闭
重新实现这个窗体的closeEvent()函数,加入判断操作

引用

void MainWindow::closeEvent(QCloseEvent *event)
{
       if (maybeSave())
       {
              writeSettings();
              event->accept();
       }
       else
       {
              event->ignore();
       }
}

但是现在问题是根据我的情况我该怎么去写if()里面的条件啊?那个条件就是判断我的子窗口是不是打开着,这个代码应该怎么写啊???
离线roywillow

只看该作者 4楼 发表于: 2010-09-12
modal方式弹出那个提示框如何?
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线sd菜
只看该作者 5楼 发表于: 2010-09-12
????什么modal啊?我是通过designer画的两个窗口。。。。你说的我不懂。。。。
离线roywillow

只看该作者 6楼 发表于: 2010-09-12
以模态方式显示窗体啊,在显示的窗体关掉之前后面的窗体你将无法操作。
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线beaujolais
只看该作者 7楼 发表于: 2010-09-13
setWindowModality(Qt::WindowModal);
离线sd菜
只看该作者 8楼 发表于: 2010-09-13
我的意思就是在有子窗口的时候,不让主窗口关闭,如果点击关闭子窗口会闪两下的那种(就是一种提示你不能关闭主窗口),具体代码怎么写啊??
离线roywillow

只看该作者 9楼 发表于: 2010-09-13
子窗口显示的时候在主窗口将一个布尔设为一个值
隐藏子窗口之后向主窗口发出一个信号,主窗口将这个布尔设成另外的值
然后只要在关闭主窗口的时候检查这个值就行了
这算是最笨的方法了吧
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线dbzhang800

只看该作者 10楼 发表于: 2010-09-14
引用第8楼sd菜于2010-09-13 20:45发表的  :
我的意思就是在有子窗口的时候,不让主窗口关闭,如果点击关闭子窗口会闪两下的那种(就是一种提示你不能关闭主窗口),具体代码怎么写啊??


你说的这个就是 模态对话框(Modal Dialogs),不妨先看看 QDialog 的manual 吧
快速回复
限100 字节
 
上一个 下一个