• 16534阅读
  • 10回复

QMessageBox自动关闭 [复制链接]

上一主题 下一主题
离线youthbjtu
 
只看楼主 正序阅读 楼主  发表于: 2013-08-14
代码如下:

QMessageBox *box=new QMessageBox(this);
box->information(this,"Operation Tips",“make sure”);
QTimer::singleShot(2000, box, SLOT(close()));

为什么定时器关闭QMessageBox无效?尝试过close()和accept()都没有效果。

我必须要用information,因为这样底层代码才会停止,不自动关闭的时候就是点OK按钮后,程序继续运行。
如果我自己定义个普通的QMessageBox,没关闭的时候,程序就自己运行了。
或者各位有什么解决方法可以提供的?
谢谢
离线陈小草
只看该作者 10楼 发表于: 2013-08-17
事件处理被阻塞了
离线btptboy

只看该作者 9楼 发表于: 2013-08-16
messagebox就是彈出一個窗口顯示一些信息的,如果實在不行的話,還是自己寫一個類,繼承自QDialog,關閉的槽函數自己在dialog類中實現就可以了。
我思故我在
离线XChinux

只看该作者 8楼 发表于: 2013-08-16
引用第1楼XChinux于2013-08-15 09:13发表的  :
你要这样:
QMessageBox *box=new QMessageBox(this);
box->setAttribute(Qt::WA_DeleteOnClose);
QTimer::singleShot(10000, box, SLOT(accept()));
.......

没看手册,这里应改成
.....
QTimer::singleShot(10000, box, SLOT(accept()));
box->exec();
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线dbzhang800

只看该作者 7楼 发表于: 2013-08-16
引用第4楼youthbjtu于2013-08-15 19:57发表的  :
可以这样写,是没有错的,你可以去试一试

如果这样,看来你需要先恶补一下C++基础知识,然后在继续学习Qt了
离线youthbjtu
只看该作者 6楼 发表于: 2013-08-15
引用第3楼wowk于2013-08-15 11:05发表的  :
//创建MessageBox这样写  
  QMessageBox    *box = new QMessageBox(this);
    box->setIcon(QMessageBox::Information);
    box->setWindowTitle(tr("information"));
    box->setText(tr("test"));
.......


嗯,就是啊,发现只用information确实无能为力
离线youthbjtu
只看该作者 5楼 发表于: 2013-08-15
引用第1楼XChinux于2013-08-15 09:13发表的  :
你要这样:
QMessageBox *box=new QMessageBox(this);
box->setAttribute(Qt::WA_DeleteOnClose);
QTimer::singleShot(10000, box, SLOT(accept()));
.......


我试了一下,还是不行也,没有退出
离线youthbjtu
只看该作者 4楼 发表于: 2013-08-15
引用第2楼dbzhang800于2013-08-15 09:26发表的  :
只要你找到你错在那儿,就会发现解决方法很多种。
首先,你调用的是类的static成员,也意味着你的那些new什么的,什么用都没有
其次,你已经提到,你的代码停留在了information 这一行,显然,在你退出它以前,它后面的代码是不会被调用的


可以这样写,是没有错的,你可以去试一试
离线wowk
只看该作者 3楼 发表于: 2013-08-15
//创建MessageBox这样写  
  QMessageBox    *box = new QMessageBox(this);
    box->setIcon(QMessageBox::Information);
    box->setWindowTitle(tr("information"));
    box->setText(tr("test"));

//执行这样写
    box->exec();

//定时器中放这两行代码
    QKeyEvent *event  = new QKeyEvent(QKeyEvent::KeyPress,Qt::Key_Escape,Qt::NoModifier);
    QCoreApplication::postEvent(box,event);

这样就能实现自动关闭了,要注意的是定时器的创建代码应该放在 box->exec()之前 ,应为代码会停在exec()处
至于 直接用 QMessageBox::informaton() ,想实现自动关闭实在无能为力
岁月静好
离线dbzhang800

只看该作者 2楼 发表于: 2013-08-15
只要你找到你错在那儿,就会发现解决方法很多种。

首先,你调用的是类的static成员,也意味着你的那些new什么的,什么用都没有
其次,你已经提到,你的代码停留在了information 这一行,显然,在你退出它以前,它后面的代码是不会被调用的
离线XChinux

只看该作者 1楼 发表于: 2013-08-15
你要这样:

QMessageBox *box=new QMessageBox(this);
box->setAttribute(Qt::WA_DeleteOnClose);
QTimer::singleShot(10000, box, SLOT(accept()));
box->information(this,"Operation Tips",“make sure”);

试验一下确看是否可行。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
快速回复
限100 字节
 
上一个 下一个