Qt的定时器0.0001

来源:互联网 发布:微信第三方源码 编辑:程序博客网 时间:2024/04/29 15:13

因为管理打铃,每当天气比较奇怪的时候,就要去做临时的调整,超级麻烦。先要关闭原来的打铃软件,再等时间到了打铃,然后过一段时间重新打开那个打铃软件,跑来跑去。所以打算自己做一个定时器来帮忙完成这项工作,希望能做到,远程操控,一次搞定。不过做事要一步一步来,先就一次搞定吧。

定时器需要有一个任务列表,再界面上用一个tableview显示,同时打算永xml结构进行存储方便下次重新运行。

<?xml version="1.0" encoding="UTF-8"?><Missons><misson><time>8:30</time><action>launch</action><path>D:/</path></misson><misson><time>9:30</time><action>play</action><path>D:/</path></misson></Missons>

结构比较简单每个任务就三个字段,时间(time)/任务类型(action)/路径(path)
任务类型是希望这个程序能打开关闭其他软件的同时具备播放音乐德功能。(毕竟还心怀自己做一个打铃软件的梦想)launch表示运行,play表示播放音乐。

使用Dom读取这个文件,新建类readxml,仅仅做了读取操作也没几行代码。

readXml::readXml(QString path){    QDomDocument doc;    QFile file(path);     if (!file.open(QIODevice::ReadOnly))     {         return;}     if (!doc.setContent(&file)) {              file.close();              return;          }     file.close();     QDomElement root = doc.documentElement();     dnl=root.childNodes();//获取子节点     count=dnl.count();//将节点个数赋值给count     file.close();}QList<QString> readXml::readItem(int i)//指定读取哪个子节点,返回一个QList包含该节点的数据{    QDomElement qe= dnl.item(i).toElement();    QDomElement element =qe.firstChildElement();    QList<QString> listStr;    for(int j=3;j>0;j--)    {        listStr<<element.text();        element=element.nextSiblingElement();    }    return listStr;}int readXml::readCount()//返回子节点的个数{    return count;}

作为万年新手,能做出个会动的东西就已经谢天谢地了,不考虑扩展性了。反正能读取了。接着要做的就是将这些数据在tableview里显示出来。

QStandardItemModel *m=new QStandardItemModel();//头文件里声明一个模型m->setHorizontalHeaderItem(0,new QStandardItem(QObject::tr("Time")));    m->setHorizontalHeaderItem(1,new QStandardItem(QObject::tr("Action")));    m->setHorizontalHeaderItem(2,new QStandardItem(QObject::tr("Path")));    ui->tableView->setModel(m);    AddData(); //将模型应用于tableview这里下面是就是AddData()方法void MainWindow::AddData(){    QString path="D:/cv.xml";    readXml *rx=new readXml(path);    for(int i=0;i<rx->readCount();i++)    {        QList<QString> lstr=rx->readItem(i);        m->setItem(i,0,new QStandardItem(lstr.value(0)));        m->setItem(i,1,new QStandardItem(lstr.value(1)));        m->setItem(i,2,new QStandardItem(lstr.value(2)));    }}

就是将所有根结点下的子节点都出来,放在tableview中,后面还需要进行排序的,现在还没弄。

定时器的基本任务定时功能,就用QTimer的静态方法signalSlot来实现,需要再弄一个线程,新建timerInThread类继承QThread来实现。

class timerInThread : public QThread{    Q_OBJECTpublic:    timerInThread();    bool stop ;    void run();public slots:    void sendflag();signals:    void timeout();};

这里分别声明了槽和信号,还有那个 Q_OBJECT 宏虽然不知道干什么的,但是必需的。

void timerInThread::run(){    //if(!stop)   // {        QTimer::singleShot(t,this,SLOT(sendflag()));        exec();   // }}void timerInThread::sendflag(){    emit timeout();}

stop变量暂时还没有什么用,run()里的exec()也是必需的,据说和事件循环有关的,还一知半解,反正没有这个exec() 信号根本发不出去。那个定义的槽就是在这里发信号的。

现在完成度就这么多,总共也没几行代码却遇到了各种问题。Dom比较通用倒没什么,Qt里信号和槽很好用,那个线程和事件循环还不是很明白。

0 0
原创粉丝点击