У меня было очень простое серверное приложение, которое отлично работало в консоли.
Теперь я переключился на графический интерфейс и создал новый проект, в котором почти все, как в консольном проекте.
Одним из различий является способ отображения моего вывода. Вместо qDebug() << "Hello abc";
Теперь я должен использовать ui->textBrowser->append("Hello abc");
,
Этот пользовательский интерфейс может быть вызван только в mainwindow.cpp.
#include "mainwindow.h"#include "myserver.h"#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::AppendToBrowser(const QString text)
{
ui->textBrowser->append(text);
}
void MainWindow::on_startButton_clicked()
{
MyServer* mServer = new MyServer;
connect(mServer, SIGNAL(updateUI(const QString)), this, SLOT(AppendToBrowser(const QString)));
}
В MyServer.cpp я должен использовать функцию соединения (см. Выше) и передать сигнал updateUI в mainwindow.cpp.
#include "myserver.h"#include "mainwindow.h"
MyServer::MyServer(QObject *parent) :
QObject(parent)
{
server = new QTcpServer(this);
connect(server,SIGNAL(newConnection()), this, SLOT(newConnection()));
if(!server->listen(QHostAddress::Any,1234))
{
emit updateUI("Server Error");
}
else
{
emit updateUI("Server started");
}
}
void MyServer::newConnection()
{
QTcpSocket *socket = server->nextPendingConnection();
socket->write("Hello client!");
socket->flush();
socket->waitForBytesWritten(3000);
socket->close();
emit updateUI("Socket closed");
}
Здесь возникает проблема: мой текстовый браузер делает ТОЛЬКО отобразить последнюю команду emit «Socket closed». Я отлаживаю программу, нажимаю кнопку запуска (которая запускает сервер и соединяет сигнал (updateUI) со слотом (appendToBrowser)) и подключаюсь к программе через telnet.
Программа работает нормально, так что я вижу «привет клиент» и завершение работы по telnet, но все же, только последний вывод emit проходит через «Socked Closed».
В самый первый момент я подумал, что мои испускаемые файлы могут перекрывать друг друга, но это невозможно, потому что «Сервер запущен» или «Ошибка сервера» должны отображаться сразу после нажатия кнопки «Пуск».
Есть идеи как решить это? Я работаю с c ++ и qt уже около 3 недель и должен признать, что очень быстро запутался, поэтому надеюсь, что вы, ребята, поймете мою проблему! пока спасибо.
Что ж, это нормально, если вы устанавливаете соединение в конструкторе MyServer, вы еще не подключили его сигнал к главному окну, поэтому оно не будет отображать ничего.
Основным исправлением было бы переместить код соединения (по крайней мере, часть if / else) в метод и вызвать этот метод после соединения вещей в вашем слоте MainWindow :: on_startButton_clicked () …
Других решений пока нет …