【问题标题】:How to let QTcpsocket remain connection after closing DialogWindow?关闭DialogWindow后如何让QTcpsocket保持连接?
【发布时间】:2015-06-30 09:15:29
【问题描述】:

在我的 Qt 应用程序中,我有一个 MainWindow 和一个 DialogWindowDialogWindow 用于设置服务器的 IP 地址和端口。而MainWindow则是连接成功后进行通信。

但是,在DialogWindow中设置QTcpSocket *socket意味着当我关闭DialogWindow时,socket将被销毁,因此socket将与服务器断开连接。

我想在DialogWindow 关闭后保持套接字连接到服务器。有没有什么方法可以达到这个效果?

请给我一些关于此的cmets和想法。我是 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();
}

主窗口.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();
}

【问题讨论】:

  • 您可以将套接字指针放置在 MainWindow 类中,并通过 DialogSetup 表单与套接字的信号进行通信。

标签: c++ qt sockets qtcpsocket


【解决方案1】:

将套接字移到对话框类之外。类似的东西:

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();
}

对话框类存储一个指向套接字的指针并使用它进行操作:

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();
}

【讨论】:

  • 需要在 DialogSetup 中再存储一个指向此套接字的指针,以提供在 DialogSetup 上单击按钮的机会
  • 谢谢你们的帮助! @t3ft3l--i ,您的意思是会有 2 个指针,1 个用于对话框设置,1 个用于主窗口?我可以知道点击按钮的机会是什么吗?
  • @Ryan presencevoid DialogSetup::on_pushButtonConnect_clicked() 所以我看到你在这个位置有QPushButtonsocket_ 的一些操作。所以需要在DiaglogSetup 访问socket_。这就是为什么我说要再存储一个指向套接字的指针:1 代表Dialog Setup,1 代表MainWindow。或者在这些类之间进行更复杂的时隙信号通信。
  • @t3ft3l--i @Cits 我无法理解类之间使用的指针。 socket_ 也是在 DialogSetup 中声明的指针。我得到了这个error: C2065: 'socket_' : undeclared identifier,这是否意味着我需要在DialogSetup 中声明socket_ 指针?另外,socket_(socket) 是否意味着类 DialogSetup 有一个套接字指针?非常感谢~~!
  • @Ryan 是的,你需要在DialogSetup.h 文件QTcpSocket *socket_ 声明
【解决方案2】:

更改它的父级,或完全删除父级(不过,您必须手动删除套接字)。

但是,更好的解决方案是 - 不要在对话框中创建套接字,而是将其传递到那里:

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();
}

【讨论】:

  • 你不能用参数DialogSetup(QObject *parent = 0, QTcpSocket *socket)定义构造函数,改变参数顺序。
  • @t3ft3l——我忘记了标题——我的错。谢谢指正。
  • 感谢您的帮助!!但是,我有这个错误 error: C2511: 'DialogSetup::DialogSetup(QTcpSocket *,QWidget *)' : overloaded member function not found in 'DialogSetup' 。 ,这是否意味着我需要在声明中添加一些内容?我试过public QTcpSocket class DialogSetup : public QDialog, public QTcpSocket { Q_OBJECT,但也有错误。
  • @Ryan 在DialogSetup.h 你需要将DialogSetup 构造函数的定义更改为explicit DialogSetup(QTcpSocket *socket, QWidget *parent = 0);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-17
相关资源
最近更新 更多