• 10360阅读
  • 14回复

PS怎么控制在模态对话框弹出时,被调函数不返回(真正的模态)? [复制链接]

上一主题 下一主题
离线yangfanxing
 
只看楼主 倒序阅读 楼主  发表于: 2010-01-22
被调函数中,

newDialog->setWindowModality(Qt::WindowModal);

设置模态对话框后,模态对话框弹出;虽然模态了,但是被调函数即返回了;

————————————————————————
像QMessageBox::critical...这类内建模态对话框通常是在确定/返回/关闭对话框后退出被调函数(即模态期间被调函数是不往下进行的);

怎么控制在模态对话框弹出时,被调函数不返回(静止)?setWindowModality不是真正的模态吗?或者还有其它设置?

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
PS:
我这里说的“对话框”可能不是严格意义上的对话框,就认为一个窗口吧!!!我想让这个窗口真正模态了(弹出的时候被调函数不返回,直到窗口关闭)~
[ 此帖被yangfanxing在2010-01-22 22:50重新编辑 ]
PHPWind好恶心。。。不想看这种界面。。。
离线午小夜

只看该作者 1楼 发表于: 2010-01-22
MyDialog* dialog = new MyDialog(this);
qDebug()<<dialog->exec();
qDebug()<<"end";
你試試,後面兩句qDebug( )要在對話框關閉的時候才會輸出。不需要設置模態或者是設置Qt::WA_DeleteOnClose屬性。
[操作系统版本]  Windows XP;Linux Ubuntu;Linux Fedora;
[Qt SDK版本]    4.7.0
[SDK 发布日期]  2010.05
[IDE(集成开发环境)] QtCreator
个人网页:http://hi.baidu.com/午小夜
學歷:Royal Jalidon
离线yangfanxing
只看该作者 2楼 发表于: 2010-01-22
dialog->exec();
我的窗体不是继承dialog的(继承的是QWiget类,所以好像只能那样模态化???),所以没有exec()成员。
[ 此帖被yangfanxing在2010-01-22 17:38重新编辑 ]
PHPWind好恶心。。。不想看这种界面。。。
离线benbenmajia

只看该作者 3楼 发表于: 2010-01-22
没关心这些东东啊,静听解释
安然.....
离线午小夜

只看该作者 4楼 发表于: 2010-01-22
不是對話框,你模態什麽?
[操作系统版本]  Windows XP;Linux Ubuntu;Linux Fedora;
[Qt SDK版本]    4.7.0
[SDK 发布日期]  2010.05
[IDE(集成开发环境)] QtCreator
个人网页:http://hi.baidu.com/午小夜
學歷:Royal Jalidon
离线benbenmajia

只看该作者 5楼 发表于: 2010-01-22
不是对话框也有的吧?模态和非模态不是widget都有的?
安然.....
离线午小夜

只看该作者 6楼 发表于: 2010-01-22
。。。鄙人孤陋寡聞。。。
[操作系统版本]  Windows XP;Linux Ubuntu;Linux Fedora;
[Qt SDK版本]    4.7.0
[SDK 发布日期]  2010.05
[IDE(集成开发环境)] QtCreator
个人网页:http://hi.baidu.com/午小夜
學歷:Royal Jalidon
离线benbenmajia

只看该作者 7楼 发表于: 2010-01-22
shit,偶承认偶孤陋寡闻了,LX等老张吧....
安然.....
离线benbenmajia

只看该作者 8楼 发表于: 2010-01-22
昏倒,模态和非模态对话框,俺低神啊
安然.....
离线benbenmajia

只看该作者 9楼 发表于: 2010-01-22
我不活了,小羊羊你们要拉着我,小夜哥哥~~~再给我们说说这个模态
安然.....
离线benbenmajia

只看该作者 10楼 发表于: 2010-01-22
模态对话框就是指在子对话框弹出时,焦点被强行集中于该子对话框,子对话框不关闭,用户将无法操作其他的窗口。非模态相反,用户仍然可以操作其他的窗口,包括该子对话框的父对话框。
如果从线程角度来讲,模态对话框实际上是线程阻塞的,也就是子对话框是一个线程,但是在创建这个子线程之后,父窗口就阻塞了;模态对话框则不是阻塞型的线程模型,父子线程可以并行运行。
和所有流行的图形类库一样,Qt也提供了创建模态和非模态对话框的机制。
在Qt中创建模态对话框,主要用到了QDialog的exec函数:
SonDialog dlg(this);
int res = dlg.exec();
if (res == QDialog::Accepted)
{
    QMessageBox::information(this, "INFORMATION", "You clicked OK button!");
}
if (res == QDialog::Rejected)
{
    QMessageBox::information(this, "INFORMATION", "You clicked CANCEL button!");
}
正如上面代码所显示的,可以通过exec函数的返回值来判断用户点击了哪个按钮使得模态对话框退出的,这可以使得我们能够根据用户的不同行为在推出退出模态对话框之后采取不同的处理方法。
在Qt中创建非模态对话框,主要用到了QDialog的show函数:
SonDialog *dlg;
dlg = new SonDialog(this);
dlg->show();
由上面代码,细心的读者可能就会问了,既然new了,如果不delete,那么内存不就存在了泄露的问题了吗?确实如此!所以,我们希望该Qt窗口在退出时自动能够delete掉自己,因此,我们在SonDialog的构造函数里,添加这样的一句代码:
setAttribute (Qt::WA_DeleteOnClose);
这样,我们的SonDialog就能够在它退出时自动的delete掉自己了,不会再造成内存泄漏问题。
安然.....
离线午小夜

只看该作者 11楼 发表于: 2010-01-22
我覺得QDialog與QWidget的主要區別就在於這個函數:
  1. int QDialog::exec()
  2. {
  3.     Q_D(QDialog);
  4.     if (d->eventLoop) {
  5.         qWarning("QDialog::exec: Recursive call detected");
  6.         return -1;
  7.     }
  8.     bool deleteOnClose = testAttribute(Qt::WA_DeleteOnClose);
  9.     setAttribute(Qt::WA_DeleteOnClose, false);
  10.     d->resetModalitySetByOpen();
  11.     bool wasShowModal = testAttribute(Qt::WA_ShowModal);
  12.     setAttribute(Qt::WA_ShowModal, true);
  13.     setResult(0);
  14. //On Windows Mobile we create an empty menu to hide the current menu
  15. #ifdef Q_WS_WINCE_WM
  16. #ifndef QT_NO_MENUBAR
  17.     QMenuBar *menuBar = 0;
  18.     if (!findChild<QMenuBar *>())
  19.         menuBar = new QMenuBar(this);
  20.     if (qt_wince_is_smartphone()) {
  21.         QAction *doneAction = new QAction(tr("Done"), this);
  22.         menuBar->setDefaultAction(doneAction);
  23.         connect(doneAction, SIGNAL(triggered()), this, SLOT(_q_doneAction()));
  24.     }
  25. #endif //QT_NO_MENUBAR
  26. #endif //Q_WS_WINCE_WM
  27. #ifdef Q_OS_SYMBIAN
  28. #ifndef QT_NO_MENUBAR
  29.     QMenuBar *menuBar = 0;
  30.     if (!findChild<QMenuBar *>())
  31.         menuBar = new QMenuBar(this);
  32. #endif
  33.     if (qobject_cast<QFileDialog *>(this) || qobject_cast<QFontDialog *>(this) ||
  34.         qobject_cast<QColorDialog *>(this) || qobject_cast<QWizard *>(this))
  35.         showMaximized();
  36.     else
  37. #endif // Q_OS_SYMBIAN
  38.         show();
  39. #ifdef Q_WS_MAC
  40.     d->mac_nativeDialogModalHelp();
  41. #endif
  42.     QEventLoop eventLoop;
  43.     d->eventLoop = &eventLoop;
  44.     QPointer<QDialog> guard = this;
  45.     (void) eventLoop.exec(QEventLoop::DialogExec);
  46.     if (guard.isNull())
  47.         return QDialog::Rejected;
  48.     d->eventLoop = 0;
  49.     setAttribute(Qt::WA_ShowModal, wasShowModal);
  50.     int res = result();
  51.     if (deleteOnClose)
  52.         delete this;
  53. #ifdef Q_WS_WINCE_WM
  54. #ifndef QT_NO_MENUBAR
  55.     else if (menuBar)
  56.         delete menuBar;
  57. #endif //QT_NO_MENUBAR
  58. #endif //Q_WS_WINCE_WM
  59. #ifdef Q_OS_SYMBIAN
  60. #ifndef QT_NO_MENUBAR
  61.     else if (menuBar)
  62.         delete menuBar;
  63. #endif //QT_NO_MENUBAR
  64. #endif //Q_OS_SYMBIAN
  65.     return res;
  66. }
[操作系统版本]  Windows XP;Linux Ubuntu;Linux Fedora;
[Qt SDK版本]    4.7.0
[SDK 发布日期]  2010.05
[IDE(集成开发环境)] QtCreator
个人网页:http://hi.baidu.com/午小夜
學歷:Royal Jalidon
离线yangfanxing
只看该作者 12楼 发表于: 2010-01-22
我不说话~我还在静静地思考。。。
PHPWind好恶心。。。不想看这种界面。。。
离线午小夜

只看该作者 13楼 发表于: 2010-01-23
你要的答案是   eventLoop  .
[操作系统版本]  Windows XP;Linux Ubuntu;Linux Fedora;
[Qt SDK版本]    4.7.0
[SDK 发布日期]  2010.05
[IDE(集成开发环境)] QtCreator
个人网页:http://hi.baidu.com/午小夜
學歷:Royal Jalidon
离线yangfanxing
只看该作者 14楼 发表于: 2010-01-23
引用第13楼午小夜于2010-01-23 17:07发表的  :
你要的答案是   eventLoop  .

呵~小夜威武。。。
PHPWind好恶心。。。不想看这种界面。。。
快速回复
限100 字节
 
上一个 下一个