我正在尝试使用QT网络实现FTPClient.
如何处理特殊情况,例如在下载网络电缆时拔掉插头,而不是互联网连接等等.
我的FTPClient如何才能了解此类事件,是否有这样的通知可用?
我试图使用像done(bool),ommandFinished(int id,bool error)这样的信号,但我没有得到任何信号.
执行同步QNetworkAccessManager :: get的正确方法是什么?
是否有任何简单的方法将文件发送到包含文件名的服务器,以便服务器和客户端中的文件名完全相同?
这是我的代码
QString path = QApplication::applicationDirPath()+"/belajardansa.bmp";
QFile inputFile(path);
QByteArray read ;
inputFile.open(QIODevice::ReadOnly);
while(1)
{
read.clear();
read = inputFile.read(32768*8);
qDebug() << "Read : " << read.size();
if(read.size()==0)
break;
qDebug() << "Written : " << socket->write(read);
socket->waitForBytesWritten();
read.clear();
}
inputFile.close();
Run Code Online (Sandbox Code Playgroud)
QTcpSocket* socket = static_cast<QTcpSocket*>(sender());
QBuffer* buffer = buffers.value(socket);
QByteArray read = socket->read(socket->bytesAvailable());
qDebug() << "Read : " << read.size();
QFile file( ???); // what should I put in the bracket???
if(!(file.open(QIODevice::Append)))
{
qDebug("File cannot be opened.");
exit(0);
}
file.write(read);
file.close();
Run Code Online (Sandbox Code Playgroud) 我正在使用以下代码获取 Qt 中的 MAC ID。
主程序
#include <QtCore/QCoreApplication>
#include "QtNetwork/QNetworkInterface"
#include "QString"
QString getMacAddress()
{
foreach(QNetworkInterface interface, QNetworkInterface::allInterfaces())
{
// Return only the first non-loopback MAC Address
if (!(interface.flags() & QNetworkInterface::IsLoopBack))
return interface.hardwareAddress();
QString text = interface.hardwareAddress();
qDebug() << text;
}
return QString();
}
int main(int argc, char *argv[])
{
getMacAddress();
QCoreApplication a(argc, argv);
return a.exec();
}
Run Code Online (Sandbox Code Playgroud)
我在控制台中什么也没得到?指导我谢谢...
注意:我也在PyQt邮件列表上发布了这个 - 如果有一个好的答案,我会在这里回答我自己的问题.
我在执行时遇到偶然的段错误问题
QApplication.quit(),可能与libQt5Network.so和/或QtWebkit有关.
首先,我正在使用的3个测试系统:
到目前为止,这些崩溃从未发生在Arch上,经常出现在Ubuntu上,而且在Windows中时常发生.(虽然Windows只是一个猜测,我只是得到这个python.exe不再工作 foo.)
我首先注意到一个大(ger)项目qutebrowser中的问题,它在键入时给了我这个堆栈跟踪:quit(在Ubuntu上):
#0 0xb5c296fc in QMutex::lock() () from /usr/lib/i386-linux-gnu/libQt5Core.so.5
#1 0xb3bdd97d in ?? () from /usr/lib/i386-linux-gnu/libQt5Network.so.5
#2 0xb3bdf0d0 in ?? () from /usr/lib/i386-linux-gnu/libQt5Network.so.5
#3 0xb3bd4418 in ?? () from /usr/lib/i386-linux-gnu/libQt5Network.so.5
#4 0xb3bd8b1e in ?? () from /usr/lib/i386-linux-gnu/libQt5Network.so.5
#5 0xb5dedf10 in QMetaObject::activate(QObject*, int, int, void**) ()
from /usr/lib/i386-linux-gnu/libQt5Core.so.5
#6 0xb5dee48b in …Run Code Online (Sandbox Code Playgroud) 我通过发送请求QNetworkAccessManager::createRequest(Operation, QNetworkRequest, outgoingData).我需要验证SSL证书的指纹是否符合我的预期.不幸的是,结果QNetworkReply返回peerCertificate带有空签名的a.
文档说明如下:
由于在握手阶段设置了对等证书,因此可以安全地从连接到sslErrors()信号或encrypted()信号的插槽访问对等证书.
如果返回空证书,则可能意味着SSL握手失败,或者它可能意味着您连接的主机没有证书,或者它可能意味着没有连接.
所以错误可能是连接已经关闭.我不能使用QNetworkAccessManager::sslErrors()Signal,因为使用SSL代理时不会发出此信号(这是我想要阻止的).
我如何获得服务器的SSL证书?是否有更多可以访问的信号以及证书仍然可用的位置?是否有其他方式可以获得证书?
更新:
现在我可以通过对QNetworkAccessManager::finished(QNetworkReply*)Signal 做出反应来获得正确的证书.但遗憾的是,发送AJAX-Request时不会发出此信号.对我来说,必须检查这些请求的指纹.有任何想法吗?
QNetworkAccessManager可以异步执行请求,并time.sleep(secs)可以暂停执行给定的秒数.我对以下代码感到困惑.是t2这里总是超过10秒?
如果不在time.sleep(secs)此处使用代码,则getWebPageSRC在固定的时间内调用完成的插槽,大约大约3秒.
我现在已经测试了几次,发现t2总是大于10秒.有谁能解释为什么?
de myMethod(self):
...
reply.finished.connect(self.getWebPageSRC)
self.t=time.clock()
time.sleep(10)
def getWebPageSRC(self):
t2=time.clock()-self.t
print(t2)
Run Code Online (Sandbox Code Playgroud)
PS,因为QNAM异步工作,我认为它在另一个线程中工作,因此有自己的事件循环,所以time.sleep(secs)挂起所有线程的所有Qt事件循环或只是它内部的线程的事件循环?在主线程中休眠会挂起所有其他线程的事件循环吗?
我是Qt的新手.我为VS2008安装了Qt并与我的VS2010集成.我只是想知道如何发出HTTP请求.我读过有关QtNetwork但QtHttp很有用的内容.
我也知道libcurl和curlpp,但我在安装它时遇到了问题,并使它与Qt一起工作.
你推荐什么,QtNetwork还是curlpp?如果是QtNetwork,请你给我一个示例函数或一段代码(以及要使用的类).如果curlpp(libcurl),你能指点我到哪里可以找到为Qt安装它的步骤(或亲切解释)吗?
非常感谢你.
我正在尝试显示使用networkaccess manager获取的get请求中获取的图像.我能够编译甚至能够运行它.但是我无法在Qlabel中显示图像.
QNetworkAccessManager* nam;
void MainWindow::on_pushButton_clicked()
{
nam = new QNetworkAccessManager(this);
QUrl url("http://i.imgur.com/Uw7Fk.jpg");
QNetworkReply* reply = nam->get(QNetworkRequest(url));
if (reply->error() == QNetworkReply::NoError)
{
QImageReader imageReader(reply);
imageReader.setAutoDetectImageFormat (false);
QImage pic = imageReader.read();
ui->label_2->setPixmap(QPixmap::fromImage(pic));
}
}
Run Code Online (Sandbox Code Playgroud)
请告诉我哪里出错了.
在以下函数中,管理器将发出finished(QNetworkReply*)信号,然后getCategories(QNetworkReply*)将调用插槽函数.
void getCategories()
{
connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(getCategories(QNetworkReply*)));
for(int i = 0; i < stores.size(); ++i)
{
request.setUrl(QUrl(QString("http://www.example.com/%1").arg(stores[i].store_id)));
manager.get(request);
}
}
Run Code Online (Sandbox Code Playgroud)
如果在第一次调用slot函数时发出第二个信号,Qt是否会启动另一个线程来运行slot函数作为对第二个信号的响应?如果是这样,是否有一些方法让第二次调用slot函数等到第一次调用结束?
更新:
我的意思是插槽功能有可能同时运行吗?
qt ×10
qtnetwork ×10
c++ ×3
pyqt ×2
python ×2
qt-signals ×2
qt4 ×2
connection ×1
curlpp ×1
http-get ×1
libcurl ×1
qtcore ×1
qtcpserver ×1
qtcpsocket ×1
synchronous ×1