标题:在 qt 事件中含有耗时操作的函数的处理
作者:qypan
日期:2016-07-26 08:33
内容:
就比如我希望实现这样的功能:
我单击鼠标时,程序以鼠标当前坐标 (x, y) 为圆心画了一个圆,半径随意(比如 30),然后我希望程序在我单击 3 秒后自动以 (x+40, y+40) 为圆心画一个跟前面同样大小的圆.
3 秒只是模拟耗时操作,这里我并不希望使用多线程,我上网查过,应该可以使用 QCoreApplication::processEvents() 或 QEventLoop 类实现。但没有找到实例,这两个东西真心不会用。希望有人可以提供可以解决我问题的链接,或者给我提供一个类似的实例。
我的代码(可在 linux 系统编译执行):
//mything.h
#ifndef MYTHING_H
#define MYTHING_H
#include
class myThing : public QLabel{
Q_OBJECT
public:
myThing(QWidget *parent = 0);
protected:
void drawAnother(int x, int y);
[color=#3333 ..
#1 [圣域天子 07-26 09:04]
和昨天重复的?
#2 [圣域天子 07-26 09:06]
给你一段代码看看:
QByteArray TcHttp::get(const QString& url)
{
QNetworkAccessManager nam;
QEventLoop loop;
QNetworkReply* reply = nam.get(QNetworkRequest(QUrl(url)));
QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()), Qt::DirectConnection);
QTimer::singleShot(m_timeout, &loop, SLOT(quit()));
loop.exec();
return reply->readAll();
}
#3 [6gongzi 07-26 13:43]
“然后我希望程序在我单击 3 秒后自动以 (x+40, y+40) 为圆心画一个跟前面同样大小的圆.”
可以采用 定时器,在你鼠标点击后,启动一个定时器,给定时器设置成3秒
在定时器的触发函数中,重新绘制一个圆,
这么做的好处是,不用多线程,而且不会阻塞主线程
QEventLoop会阻塞主线程,所谓的耗时操作,可以什么也不做,否者界面容易假死
#4 回 圣域天子 的帖子 [qypan 07-26 14:56]
圣域天子:和昨天重复的? (2016-07-26 09:04)
恩,第一次在论坛提问,我找发贴都找了好一会~,发了后发现分类写错了,重新弄了一遍,不要介意哈
#5 回 6gongzi 的帖子 [qypan 07-26 15:05]
6gongzi:“然后我希望程序在我单击 3 秒后自动以 (x+40, y+40) 为圆心画一个跟前面同样大小的圆.”
可以采用 定时器,在你鼠标点击后,启动一个定时器,给定时器设置成3秒
在定时器的触发函数中,重新绘制一个圆,
这么做的好处是,不用多线程,而且不会阻塞主线程
....... (2016-07-26 13:43)
感谢你的回复!其实我目的是写一个五子棋的 AI,而计算机计算落子需要几秒时间,玩家落子是用 mousePressEvent() 实现的,而我在玩家落子后把计算机的求解函数放在了 mousePressEvent() 里面,所以出现我在单击后,直到计算机计算好落子点后才把两个棋子同时画在棋盘上~然而搞了挺久地,在这卡住了。。。