Qt postEvent

关于Qt postEvent

呵呵,转载了这么多别人的关于Event方面的文章,我也来说说两三句吧

前几天一直被这个postEvent给困扰着,所以主要讲解postEvent的个人理解吧,随便稍微提一下其他的实现机制。

Qt中抛消息有:信号和槽、postEvent、sentEvent等机制,sentEvent只支持同步的。postEvent可以实现异步的,其机制是将消息发送到消息队列中,消息队列又会把这些消息都抛出(当然要实现该功能我们也可以用信号和槽机制,将connect函数的最后一个参数设置为Qt::QueuedConnection即可)。

言归正传,上段我们说到消息队列把消息抛出来,我们该如何去捕获该消息呢?我们只要实现父类中的event()或者customEvent()函数即可,在里面实现我们自己的处理,在此建议采用customEvent()。

以下是一个简单的实例:

#include <QWidget>
#include <QEvent>

const QEvent::Type CustomEvent_Login = (QEvent::Type)5001;//建议用5000以上唯一的标识


class PostEvent : public QWidget
{
Q_OBJECT

public:
PostEvent(QWidget *parent = 0);
~PostEvent();

private:
void customEvent(QEvent *e); //该函数是父类QWidget的虚函数

};

PostEvent::PostEvent(QWidget *parent)
{
QApplication::postEvent(this, new QEvent(CustomEvent_Login)); //该函数实现将自定义的消息发送到队列,且new QEvent(CustomEvent_Login))只能动态分配,原因请看Qt的帮助文档中的postEvent函数说明。
}

void PostEvent::customEvent(QEvent *e)
{
if (e->type() == CustomEvent_Login) //捕获消息
{
QMessageBox msgBox;
msgBox.setText("The document has been modified.");
msgBox.exec();
}
}

呵呵,就这样吧 本人一开始犯了一个很白痴的错误,即把customEvent函数当作用户可以自定义的函数,殊不知是父类中的虚函数,所以一直捕获不到消息。好了,以上只是一个简单的关于postEvent的一个应用,如果想了解更多的消息机制请阅读其他关于event的文章。

发布了66 篇原创文章 · 获赞 47 · 访问量 81万+
展开阅读全文

qt http post 上传出问题

05-05

//上传文件到linux服务器上 void Widget::on_pushButton_2_clicked() { QString UrlFilePath = ""; //服务器放置上传文件地址路径 QString filePath = ui->lineEdit_2->text(); //本地将要上传的文件路径 QFileInfo info(filePath); file = new QFile(filePath); QString fileName = info.fileName(); if(!file->open(QIODevice::ReadOnly)) { qDebug() << "file open error"; delete file; file = NULL; } int file_len = file->size(); // QByteArray data = file->readAll(); QDataStream in(file); m_buf = new char[file_len]; if(in.readRawData(m_buf,file_len)!=file_len){ qWarning("文件读取不完整readRaw"); } file->close(); delete file; file = NULL; UrlFilePath = QString("http://192.168.2.1/images/advertise/%1").arg(fileName); // UrlFilePath = QString("http://192.168.2.1/images/advertise/"); url.clear(); //准备路径地址 url.setUrl(UrlFilePath); //准备数据 QByteArray arr = QByteArray(m_buf,file_len); /*****连接实现*****/ QNetworkRequest request = QNetworkRequest(url); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); request.setHeader(QNetworkRequest::ContentLengthHeader,QVariant(arr.size())); reply = manager->post(request,arr); //QNetworkReply reply指针 //上传关联信号 connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(upLoadError(QNetworkReply::NetworkError))); //上传完成后 connect(reply,SIGNAL(finished()),this,SLOT(httpFinished())); //更新进度条 connect(reply,SIGNAL(uploadProgress(qint64,qint64)),this,SLOT(updateDataReadProgress(qint64 ,qint64))); ui->progressBar->setValue(0); //显示进度条 ui->progressBar->show(); } 问答

QT post指令如何立刻执行

02-10

事件描述:客户端需要向服务器POST用户名和密码,如果密码正确,服务器会返还一个随机数,然后客户端将这个随机数返回给服务器,就可以进入服务器的下一级目录,上传数据过去。 问题:发送第一个POST指令时(用户名和密码),服务器没有立刻执行触发SLOT函数这个时候无法获取随机数,而时等到整个代码跑完时才触发SLOT函数,这样第二个POST指令必须被放入SLOT函数中,程序定义了这个函数,connect(qnam, SIGNAL(finished(QNetworkReply*)), this, SLOT(finishedSlot(QNetworkReply*)));导致每一个POST完成后,都会调用SLOT,程序限入了死循环。。 关键代码如下: void HttpWindow::downloadFile() { url = urlLineEdit->text(); QNetworkRequest networkrequest; networkrequest.setUrl(url); QByteArray append("username=root&password="); qnam->post(networkrequest, append);//我想在这里调SLOT函数,获取随机数,然后将下面的SLOT函数中的指令全部移到下面来。 qnam->post( } void HttpWindow::finishedSlot(QNetworkReply *reply) { QString tmp1; if (reply->error() == QNetworkReply::NoError) { QList<QNetworkReply::RawHeaderPair> tmp= reply->rawHeaderPairs(); for(int i=0;i<tmp.size();i++) { QNetworkReply::RawHeaderPair pair = tmp[i]; QByteArray bytes = pair.second; tmp1 = QString::fromUtf8(bytes); int pos=tmp1.indexOf("stok="); if(pos!=-1) { stok=tmp1.mid(pos,pos+32); QString firstAdd("http://192.168.1.1/cgi-bin/luci/;"); QString secondAdd("/admin/system/flashops"); stok+=secondAdd; firstAdd+=stok; QNetworkRequest networkrequest; networkrequest.setUrl(firstAdd); QFile software("E:/software/openwrt-ar71xx-generic-db120-squashfs-sysupgrade.bin"); if(software.open(QIODevice::ReadOnly)) { QByteArray formData; QString _boundary="---------------------------7de3e3910060e"; QString first_boundary="content-Type: multipart/form-data; boundary="; first_boundary+=_boundary; reply=qnam->post(networkrequest, first_boundary.toAscii()); QString content_Disposition="Content-Disposition: form-data; name=\"keep\"\r\n\r\n"; qnam->post(networkrequest, content_Disposition.toAscii()); QString ON="on\r\n"; reply=qnam->post(networkrequest, ON.toAscii()); reply=qnam->post(networkrequest, _boundary.toAscii()); QString Content_Disposition("Content-Disposition: form-data; name=\"D:\\software\\openwrt-ar71xx-generic-db120-squashfs-sysupgrade.bin\""); qnam->post(networkrequest, Content_Disposition.toAscii()); //formData.append(QString("--"+_boundary+"\r\n").toAscii()); //formData.append(QString("Content-Disposition: form-data; name=\"D:\\software\\openwrt-ar71xx-generic-db120-squashfs-sysupgrade.bin\"").toUtf8()); formData.append(software.readAll()); reply=qnam->post(networkrequest, formData); reply=qnam->post(networkrequest, QString("\r\n").toAscii()); reply=qnam->post(networkrequest, _boundary.toAscii()); //formData.append(QString("\r\n").toAscii()); //formData.append(QString("--"+_boundary+"\r\n").toAscii()); //int contentLength=formData.size(); //networkrequest.setHeader(QNetworkRequest::ContentTypeHeader,contenttype); //networkrequest.setHeader(QNetworkRequest::ContentLengthHeader,contentLength); } else return; break; } } } else { return ; } reply->deleteLater(); } 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览