2013-07-04 4 views
0

J'ai eu cette application serveur très simple, qui a fonctionné parfaitement dans une console. Maintenant je suis passé à gui et j'ai fait un nouveau projet, avec presque tout comme dans le projet console. L'une des diffrences est la manière d'afficher ma sortie. Au lieu de qDebug() << "Hello abc"; je dois maintenant utiliser ui->textBrowser->append("Hello abc");. Cet ui ne peut être appelé que dans mainwindow.cpp.qt c emit textbrowser

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

Dans le MyServer.cpp j'utiliser la fonction de connexion (voir ci-dessus) et émettre le signal updateUI au 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"); 
} 

vient ici le problème: Mon textbrowser ne seulement afficher la dernière emit-commande "Socket fermée". Je débogue le programme, appuie sur le bouton de démarrage (qui démarre le serveur et connecte le signal (updateUI) avec le slot (appendToBrowser)) et se connecte au programme via telnet. Le programme fonctionne très bien jusqu'à ce que je vois "hello client" et le quitter sur telnet mais encore, il n'y a que la dernière sortie d'émission qui passe par "Socked Closed". Dans le tout premier moment, j'ai pensé que mes émissions peuvent se substituer l'une à l'autre, mais ce n'est pas possible car un "serveur démarré" ou "Server Error" devrait être vu juste après avoir cliqué sur startButton.

Des idées pour résoudre ce problème? Je travaille avec C++ et qt depuis environ 3 semaines maintenant et je dois avouer que je suis très confus très rapidement donc j'espère que vous pourrez comprendre mon problème! merci pour l'instant.

Répondre

1

Eh bien c'est assez normal, si vous faites votre connexion dans le constructeur de MyServer, vous n'avez pas encore connecté son signal à la fenêtre principale, donc il n'affichera rien.

Un correctif de base serait de déplacer le code de connexion (au moins si/partie d'autre) dans une méthode, et appeler cette méthode après la connexion des choses ensemble dans votre MainWindow :: fente on_startButton_clicked() ...

+0

Merci beaucoup à vous! je l'ai :) – beary