如何让QTcpsocket在关闭DialogWindow后保持连接?
How to let QTcpsocket remain connection after closing DialogWindow?
在我的 Qt 应用程序中,我有一个 MainWindow
和一个 DialogWindow
。 DialogWindow
用于设置服务器的IP 地址和端口。而MainWindow
是连接成功后进行通信。
但是,在DialogWindow
中设置QTcpSocket *socket
意味着当我关闭DialogWindow
时,socket
将被销毁,因此socket
将是与服务器断开连接。
我想在 DialogWindow
关闭后保持套接字与服务器的连接。有什么方法可以达到这个效果吗?
请给我一些意见和想法。我是Qt的新手。
DialogSetup.cpp
DialogSetup::DialogSetup(QWidget *parent) :
QDialog(parent),
ui(new Ui::DialogSetup)
{
ui->setupUi(this);
socket = new QTcpSocket(this);
connect(socket, SIGNAL(connected()),this, SLOT(wasconnected()));
connect(socket,SIGNAL(disconnected()),this,SLOT(wasdisconnected()));
}
DialogSetup::~DialogSetup()
{
delete ui;
}
void DialogSetup::on_pushButtonConnect_clicked()
{
m_strIPAdd = ui->lineEditIPAdd->text();
m_strPort = ui->lineEditPort->text().toInt();
socket->connectToHost(m_strIPAdd,m_strPort);
if(!socket->waitForConnected(10000))
{
ui->labelStatus->setText("Error");
QMessageBox::information(this,"Error",socket->errorString());
}
}
void DialogSetup::wasconnected()
{
socket->write("Hello server!");
ui->labelStatus->setText("Connected!");
ui->pushButtonDisconnect->setDisabled(false);
}
void DialogSetup::wasdisconnected()
{
ui->labelStatus->setText("Disonnected!");
}
void DialogSetup::on_pushButtonDisconnect_clicked()
{
socket->close();
}
Mainwindow.cpp
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_actionSetup_triggered()
{
dialogsetup = new DialogSetup(this);
dialogsetup->show();
}
更改它的父级,或完全删除父级(不过,您必须手动删除套接字)。
但是,更好的解决方案是 - 不要在对话框中创建套接字,而是将其传递到那里:
DialogSetup::DialogSetup(QTcpSocket *socket_, QWidget *parent) :
QDialog(parent),
ui(new Ui::DialogSetup),
socket(socket_)
...
void MainWindow::on_actionSetup_triggered()
{
dialogsetup = new DialogSetup(socket, this);
dialogsetup->show();
}
将套接字移出对话框class。类似的东西:
void MainWindow::on_actionSetup_triggered()
{
socket = new QTcpSocket(this); //declared as private in MainWindow
dialogsetup = new DialogSetup(socket, this);
connect(socket,SIGNAL(connected()), dialogsetup, SLOT(wasconnected()));
connect(socket,SIGNAL(disconnected()), dialogsetup ,SLOT(wasdisconnected()));
dialogsetup->show();
}
对话框class存储一个指向套接字的指针并用它操作:
DialogSetup::DialogSetup(QTcpSocket *socket, QWidget *parent) :
QDialog(parent),
socket_(socket),
ui(new Ui::DialogSetup)
{
ui->setupUi(this);
}
DialogSetup::~DialogSetup()
{
delete ui;
}
void DialogSetup::on_pushButtonConnect_clicked()
{
m_strIPAdd = ui->lineEditIPAdd->text();
m_strPort = ui->lineEditPort->text().toInt();
socket_->connectToHost(m_strIPAdd,m_strPort);
if(!socket_->waitForConnected(10000))
{
ui->labelStatus->setText("Error");
QMessageBox::information(this,"Error",socket->errorString());
}
}
void DialogSetup::wasconnected()
{
socket_->write("Hello server!");
ui->labelStatus->setText("Connected!");
ui->pushButtonDisconnect->setDisabled(false);
}
void DialogSetup::wasdisconnected()
{
ui->labelStatus->setText("Disonnected!");
}
void DialogSetup::on_pushButtonDisconnect_clicked()
{
socket_->close();
}
在我的 Qt 应用程序中,我有一个 MainWindow
和一个 DialogWindow
。 DialogWindow
用于设置服务器的IP 地址和端口。而MainWindow
是连接成功后进行通信。
但是,在DialogWindow
中设置QTcpSocket *socket
意味着当我关闭DialogWindow
时,socket
将被销毁,因此socket
将是与服务器断开连接。
我想在 DialogWindow
关闭后保持套接字与服务器的连接。有什么方法可以达到这个效果吗?
请给我一些意见和想法。我是Qt的新手。
DialogSetup.cpp
DialogSetup::DialogSetup(QWidget *parent) :
QDialog(parent),
ui(new Ui::DialogSetup)
{
ui->setupUi(this);
socket = new QTcpSocket(this);
connect(socket, SIGNAL(connected()),this, SLOT(wasconnected()));
connect(socket,SIGNAL(disconnected()),this,SLOT(wasdisconnected()));
}
DialogSetup::~DialogSetup()
{
delete ui;
}
void DialogSetup::on_pushButtonConnect_clicked()
{
m_strIPAdd = ui->lineEditIPAdd->text();
m_strPort = ui->lineEditPort->text().toInt();
socket->connectToHost(m_strIPAdd,m_strPort);
if(!socket->waitForConnected(10000))
{
ui->labelStatus->setText("Error");
QMessageBox::information(this,"Error",socket->errorString());
}
}
void DialogSetup::wasconnected()
{
socket->write("Hello server!");
ui->labelStatus->setText("Connected!");
ui->pushButtonDisconnect->setDisabled(false);
}
void DialogSetup::wasdisconnected()
{
ui->labelStatus->setText("Disonnected!");
}
void DialogSetup::on_pushButtonDisconnect_clicked()
{
socket->close();
}
Mainwindow.cpp
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_actionSetup_triggered()
{
dialogsetup = new DialogSetup(this);
dialogsetup->show();
}
更改它的父级,或完全删除父级(不过,您必须手动删除套接字)。
但是,更好的解决方案是 - 不要在对话框中创建套接字,而是将其传递到那里:
DialogSetup::DialogSetup(QTcpSocket *socket_, QWidget *parent) :
QDialog(parent),
ui(new Ui::DialogSetup),
socket(socket_)
...
void MainWindow::on_actionSetup_triggered()
{
dialogsetup = new DialogSetup(socket, this);
dialogsetup->show();
}
将套接字移出对话框class。类似的东西:
void MainWindow::on_actionSetup_triggered()
{
socket = new QTcpSocket(this); //declared as private in MainWindow
dialogsetup = new DialogSetup(socket, this);
connect(socket,SIGNAL(connected()), dialogsetup, SLOT(wasconnected()));
connect(socket,SIGNAL(disconnected()), dialogsetup ,SLOT(wasdisconnected()));
dialogsetup->show();
}
对话框class存储一个指向套接字的指针并用它操作:
DialogSetup::DialogSetup(QTcpSocket *socket, QWidget *parent) :
QDialog(parent),
socket_(socket),
ui(new Ui::DialogSetup)
{
ui->setupUi(this);
}
DialogSetup::~DialogSetup()
{
delete ui;
}
void DialogSetup::on_pushButtonConnect_clicked()
{
m_strIPAdd = ui->lineEditIPAdd->text();
m_strPort = ui->lineEditPort->text().toInt();
socket_->connectToHost(m_strIPAdd,m_strPort);
if(!socket_->waitForConnected(10000))
{
ui->labelStatus->setText("Error");
QMessageBox::information(this,"Error",socket->errorString());
}
}
void DialogSetup::wasconnected()
{
socket_->write("Hello server!");
ui->labelStatus->setText("Connected!");
ui->pushButtonDisconnect->setDisabled(false);
}
void DialogSetup::wasdisconnected()
{
ui->labelStatus->setText("Disonnected!");
}
void DialogSetup::on_pushButtonDisconnect_clicked()
{
socket_->close();
}