当前位置: 首页 > news >正文

如何做网站呢/百度关键字搜索排名

如何做网站呢,百度关键字搜索排名,怎么看网站室哪做的,新乡做新网站起源 qtcn中文论坛中有网友问到: 假设程序正常运行时,只有一个简单的窗体A,此时只有一个GUI主线程,在这个主线程中有一个事件循环处理窗体上的事件。当此程序运行到某阶段时,弹出一个模态窗体B(书上说模态…

起源

qtcn中文论坛中有网友问到:

假设程序正常运行时,只有一个简单的窗体A,此时只有一个GUI主线程,在这个主线程中有一个事件循环处理窗体上的事件。当此程序运行到某阶段时,弹出一个模态窗体B(书上说模态窗体是有其自己的事件循环的),此时模态窗体B是否会有一个对应的子线程处理其事件循环?

这儿其实有两个问题:

  • 模态对话框 和 事件循环 没有必然联系
  • 事件循环 和 子线程 没有必然联系

题外:

如果进一步呢?其实我们还可以说:

  • 模态对话框 和 QDialog 没必要联系

QDialog 对话框

两种常规用法:

非模态

QDialog * dlg = new QDialog()
dlg->show();

当然,这儿用指针(即分配到heap中)不是必须的。 (有疑问?或者有时发现窗口一闪而过?那么你需要了解C、C++中变量的作用域和生存周期)

模态

QDialog dlg;
dlg.exec();

这种情况下,我们一般都是将对象分配上 stack 上,而不是heap上。

当然,你喜欢用 heap,也没问题:

Dialog * dlg = new QDialog();
dlg->exec();
delete dlg;

模态对话框

前面的 show() 与 exec() 并不是模态与非模态的区别。

想让一个Widget成为模态,我们只需要对其设置:

setAttribute(Qt::WA_ShowModal, true);

注意:这是QWidget的成员函数,也就是说,QWidget可以显示为模态或非模态!

setWindowModality

除了直接调用setAttribute外,QWidget 提供了一个易用的函数,来设置窗体的模态。其源码如下:

void QWidget::setWindowModality(Qt::WindowModality windowModality)
{data->window_modality = windowModality;// setModal_sys() will be called by setAttribute()setAttribute(Qt::WA_ShowModal, (data->window_modality != Qt::NonModal));setAttribute(Qt::WA_SetWindowModality, true);
}

注意:该函数的参数取值:NonModal、WindowModal、ApplicationModal 分别对应默认情况下的

  • QDialog::show()
  • QDialog::open()
  • QDialog::exec()

如果你没有使用QDialog::open()的需求,你可能也不需要该函数。

setModal

除了QWidget提供的成员,QDialog 提供了 setModal 的成员函数,我们看看其代码:

void QDialog::setModal(bool modal)
{setAttribute(Qt::WA_ShowModal, modal);
}

不用解释了吧?我们要显示模态对话框,只需要类似下面的代码:

QDialog * dlg = new QDialog();
dlg->setAttribute(Qt::WA_ShowModal, true);
dlg->show();

exec()

有问题是不?为啥exec() 直接可以显示模态对话框呢?看QDialog源代码吧

int QDialog::exec()
{Q_D(QDialog);
...setAttribute(Qt::WA_ShowModal, true);
...show();
...QEventLoop eventLoop;(void) eventLoop.exec(QEventLoop::DialogExec);
...
}

看到答案没:exec() 先设置modal属性,而后调用 show() 显示对话框,最后启用事件循环

事件循环

Qt 程序时事件驱动的,每个程序,我们需要调用 QApplication::exec() 来启用事件循环。

int QCoreApplication::exec()
{
...QEventLoop eventLoop;int returnCode = eventLoop.exec();
...return returnCode;
}

用前面的 QDialog::exec() 一样,都是调用的 QEventLoop::exec()

int QEventLoop::exec(ProcessEventsFlags flags)
{Q_D(QEventLoop);
...while (!d->exit)processEvents(flags | WaitForMoreEvents | EventLoopExec);
...return d->returnCode;
}

bool QEventLoop::processEvents(ProcessEventsFlags flags)
{Q_D(QEventLoop);if (!d->threadData->eventDispatcher)return false;if (flags & DeferredDeletion)QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete);return d->threadData->eventDispatcher->processEvents(flags);
}

进一步:这将调用平台相关的函数,比如在windows下

bool QGuiEventDispatcherWin32::processEvents(QEventLoop::ProcessEventsFlags flags)
{if (!QEventDispatcherWin32::processEvents(flags))return false;if (configRequests)                        // any pending configs?qWinProcessConfigRequests();return true;
}

事件循环和线程没有必然的联系,事件循环可以用在QThread中,而且从Qt4.4开始,QThread的run函数默认就调用了自己的事件循环。

对与QDialog来说,当它自己的QEventLoop启用时,主程序的 QEventLoop 当然是处于暂停状态了。说到底,就是两个死循环,一个在内,一个在外,只有里面的退出后,外边的循环才会执行。不过由于两个循环执行的命令是基本一样的,都是调用并处理程序收到的各种事件,所以,可能变得不容易理解

 

转自:http://blog.csdn.net/dbzhang800/article/details/6300416

http://www.jmfq.cn/news/5094055.html

相关文章:

  • wordpress 地图插件/seo推广沧州公司电话
  • php网站开发几技术难点/企业网站建设方案策划
  • 做空包网站/适合发表个人文章的平台
  • php做网站都需要学什么/深圳竞价托管公司
  • 为自己做的网站申请域名/游戏推广员是诈骗吗
  • 淘宝网站边上的导航栏怎么做/搜索引擎优化的重要性
  • 网站底部 图标/seo在线培训
  • 织梦网站栏目不显示不出来/竞价推广网络推广运营
  • icp域名信息备案管理系统/移动端排名优化软件
  • 哪个软件做网站好/网站搜什么关键词
  • 手机网站打不开是什么原因造成的/企业关键词优化推荐
  • 网站在正在建设中/301313龙虎榜
  • 李宁运动服网站建设规划书/百度一下主页官网
  • 露兜博客 wordpress/网络培训seo
  • 广州企业做网站/seo服务商
  • 网站空间哪家公司的好/完整的网页设计代码
  • 医院加强网站建设/网页优化包括
  • 长沙微信网站公司/西安关键词优化平台
  • 用手机可以做网站/武汉建站优化厂家
  • 邹城网站制作/网站排名优化服务公司
  • 做网站都需要什么软件/品牌定位
  • wordpress 文件限制/seo任务
  • 如今做哪个网站致富/常德网站设计
  • 怎么建网站站点/b2b电子商务网
  • 找人做网站需要什么软件/手机百度一下百度
  • 设计素材网站合集/成品影视app开发
  • 厦门哪家公司做网站/湖南关键词优化首选
  • 重庆工装公司/百度关键词在线优化
  • 潍坊网站建设网超/软文之家
  • 购物网站页面设计思路/下载班级优化大师app