main.cpp
中的代码Client c;
c.start("ip-address", port, "final folder/file");
它工作,客户端下载我需要的文件。
但是如果我在按钮点击操作中将相同的代码放在 mainwindow.cpp 中
void MainWindow::on_btn_connect_clicked()
{
Client c;
c.start("ip-address", port, "final folder/file");
}
它不起作用。这是为什么?我是Qt和网络编码的新手。一些源代码
void Client::start(QString address, qint16 port, QString file)
{
qDebug() << "client started";
QHostAddress addr(address);
filename = file;
client->connectToHost(addr, port);
qDebug() << client->socketDescriptor();
}
我有 readyRead()但是程序没有到达那里。
Client::Client(QObject *parent) :
QObject(parent)
{
client = new QTcpSocket(this);
client->abort();
connect(client, SIGNAL(readyRead()), this, SLOT(ReadData()));
connect(client, SIGNAL(disconnected()), this, SLOT(Completed()));
}
答案 0 :(得分:0)
您是否已将按钮点击信号连接到on_btn_connect插槽?
答案 1 :(得分:0)
当您像这样创建客户端时:
void MainWindow::on_btn_connect_clicked()
{
Client c;
c.start("ip-address", port, "final folder/file");
}
创建客户端对象,调用start,然后立即销毁一个执行离开on_btn_conenct_clicked()
函数。除非&#34;开始&#34;否则这将永远不会有效。在您离开时,函数已完成您想要执行的任何操作,但您发布的代码似乎并非如此。
为了使其正常工作,您必须使客户端成为MainWindow类的成员,以便在调用插槽后使用它。另一个选择是使它成为一个指针,在on_btn_connect_clicked()槽中创建它,然后将它完成所有工作时发出的任何信号连接到它自己的deleteLater槽。像这样:
void MainWindow::on_btn_connect_clicked()
{
Client* c = new Client(this);
connect(c, &Client::downloadComplete, c, &Client::deleteLater);
c->start("ip-address", port, "final folder/file");
}
下载完成信号是您必须确保在完成您要完成的操作时自行发出的信号,否则您将发生内存泄漏,并且在整个MainWindow之前客户端对象不会被删除被删除。