QT Time 的延迟应用求教
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QT Time 的延迟应用求教相关的知识,希望对你有一定的参考价值。
QTime time;
time.start();
while(time.elapsed()>=spinBoxGap->value()*1000);
....
本人新的,请教啊:
spinBoxGap里是我我设置的要延迟的秒数,为什么While好像一点也没延迟。
time.start();
while(time.elapsed()>=spinBoxGap->value()*1000);
// 从此段代码可以看出,你是想设定一个时间间隔,执行一次循环time.elapsed(),但是你此处的time未设置间隔。具体设置好像直接start(1000)就可以了,1000单位是毫秒。,即每分钟循环执行1次。
// 给你推荐个方法采用QTimer(定时器)
timer = new QTimer();
// 设置定时器执行间隔
timer->setInterval(spinBoxGap->currentText().toInt() * 1000);
// 然后连接槽函数,执行相关操作即可
connect(timer, SIGNAL(timeout()), this, SLLOT(whatyoudo()));追问
我后面有七八个处理语句和延迟,用做每个处理都等待一段时间,用qtimer的timeout()不好处理,用qtime有什么办法吗?
追答// 你可以在线程中处理啊,完成一个后直接加个延迟就好了啊,非要用QTime吗?void MyThread::run()
fun_1();
sleep(1000); // 这里sleep中的毫秒可以用你的spinBox中的值传递过来,线程不能直接应用QSpinBox哦,通过主线程转换
fun_2();
sleep(2000);
...
追问
谢谢,不过我对线程不了解……,要是用QTime有办法吗?这也算是一种方法吧。我不想把每段处理都写成函数,
追答// 哦,这样的话办法是有,不过可能导致主线程卡住QTime time;
time.start();
while (1)
// 此处判断设置间隔时间,如果大于等于SpinBox中设置的值,那么执行
if (time.elapsed()>=spinBoxGap->value()*1000)
...; // 这里你只能做判断,到底执行那个步骤
// 一个步骤执行完成后重新启动time,让他重新开始计算
time.restart();
// 判断上面步骤是否执行完?如果完成结束循环
if (!isRun)
break;
追问
如果你的if()可以判断执行,那我的while()也应该是可以的吧?
追答你的while你仔细看就知道执行不了。此时的time.elapsed()应该等于0,你却判断要大大于spinbox设定的值才执行,你觉得合适吗?如果你按照小于的话怎么样结束呢?感觉此处还是用if比较好。
追问嗯,是的,我逻辑写错了,昨天试了可以延迟,但不能操作其他的,而且出现:我后面的几个延迟好像全部无效,第一个延迟是所有延迟总和,最后所有动作一块执行,不知道怎么回事。
追答具体操作不知道你是怎么弄的,不介意的话加我QQ我帮你看看:2893891799
参考技术A 你这while语句什么都不做 就是延时你也看不出来呀 为什么不用QTimer在用QT编程时,建了一个自己的类,但是编译时出现错误,求教大侠们如何解决
错误提示为widgetshare.cpp:12: error: no matching function for call to 'Widgetshare::connect(QTcpServer**, const char*, Widgetshare* const, const char*)',其中Widgetshare是我自己的类,类定义为//#ifndef WIDGETSHARE_H
#define WIDGETSHARE_H
#include <QtNetWork>
#include <QWidget>
#include <QTcpServer>
#include <QObject>
namespace Ui
class Widget;
class Widgetshare : public QWidget
Q_OBJECT
public:
explicit Widgetshare(QWidget *parent = 0);
~Widgetshare();
private:
Ui::Widget *ui;
QTcpServer *tcpServer;
QTcpSocket *tcpServerConnection;
qint64 totalBytes; //存放总大小信息
qint64 bytesReceived; //已收到数据的大小
qint64 fileNameSize; //文件名的大小信息
QString fileName; //存放文件名
QFile *localFile; //本地文件
QByteArray inBlock; //数据缓冲区
private slots:
void on_startButton_clicked();
void start(); //开始监听
void acceptConnection(); //建立连接
void updateServerProgress(); //更新进度条,接收数据
void displayError(QAbstractSocket::SocketError socketError);
//显示错误
;
//#endif
WIDGETSHARE_H,出错的程序文件为
#include "widgetshare.h"
#include "ui_widgetshare.h"
#include <QObject>
Widgetshare::Widgetshare(QWidget *parent):
QWidget(parent),
ui(new Ui::Widget)
totalBytes = 0;
bytesReceived = 0;
fileNameSize = 0;
QObject::connect(&tcpServer,SIGNAL(newConnection()),this,SLOT(acceptConnection()));
//当发现新连接时发出newConnection()信号
时间比较紧,可以追加分
我用的就是QObject::connect 啊,不好使
追答widgetshare.cpp:12: error: no matching function for call to
'Widgetshare::connect(QTcpServer**, const char*, Widgetshare* const, const char*)'
你没贴这部分出来吧
connect只有QObject::connect这个用法,有什么好不好使的
上面的代码是分两部分的,下半部分的 QObject::connect(&tcpServer,SIGNAL(newConnection()),this,SLOT(acceptConnection()));
//当发现新连接时发出newConnection()信号
就是出错的代码,我用的是的QObject::connect,可是还是报那个错
QObject::connect(tcpServer,SIGNAL(newConnection()),this,SLOT(acceptConnection()));
tcpServer已是指针,不用加&
你确定 这个函数是静态函数吗?追问
刚学,不太懂静态函数什么的,能说一下怎么解决吗?
追答楼上说的真确,函数参数不匹配,你将&取掉就好了
以上是关于QT Time 的延迟应用求教的主要内容,如果未能解决你的问题,请参考以下文章
CMSIS-RTOS 时间管理之时间延迟Time Delay