2015-06-30 3 views
0

В моем приложении Qt у меня есть MainWindow и DialogWindow. DialogWindow предназначен для настройки IP-адреса и порта сервера. Пока MainWindow предназначен для осуществления связи после успешного соединения.Как отключить QTcpsocket после закрытия DialogWindow?

Однако создание QTcpSocket *socket в DialogWindow означает, что, когда я закрыть 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(); 
} 
+0

Вы можете разместить указатель сокетов в классе MainWindow и взаимодействуете с сигналами сокета throuhg DialogSetup формы. –

ответ

2

Переместить сокет вне диалогового класса. Нечто подобное:

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

Нужно сохранить еще один указатель на этот сокет в DialogSetup, чтобы обеспечить возможность нажатия на кнопке на DialogSetup –

+0

«хранить QPointer» – UmNyobe

+0

Спасибо вам, ребята, помогите! @ t3ft3l - i, вы имеете в виду, что будет 2 указателя, 1 для Dialog Setup и 1 для mainwindow? И могу ли я узнать, что можно нажать на кнопку? – Ryan

0

Изменение его родителей или удалить родителя на всех (хотя, вам придется удалить сокет вручную).

Но, лучшим решением было бы - не удалось создать сокет в диалоге, но передать его там:

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

Вы не можете определить конструктор с параметрами 'DialogSetup (QObject * parent = 0, QTcpSocket * socket)', изменить порядок параметров. –

+0

@ t3ft3l - я забыл о заголовке - мой плохой. Спасибо за исправление. – Amartel

+0

Спасибо за помощь! Тем не менее, у меня есть эта ошибка 'error: C2511: 'DialogSetup :: DialogSetup (QTcpSocket *, QWidget *)': перегруженная функция-член не найдена в 'DialogSetup''. , значит, мне нужно добавить что-то в декларацию? Я пробовал открытый QTcpSocket 'class DialogSetup: public QDialog, public QTcpSocket { Q_OBJECT', , но также получил ошибки. – Ryan

 Смежные вопросы

  • Нет связанных вопросов^_^