qt c发出textbrowser

时间:2013-07-04 11:10:44

标签: c++ qt emit

我有一个非常简单的服务器应用程序,在控制台中运行良好。 现在我切换到gui并创建了一个新项目,几乎所有内容都与控制台项目一样。 其中一个不同之处是显示输出的方式。而不是qDebug() << "Hello abc";我现在必须使用ui->textBrowser->append("Hello abc");。 这个ui只能在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中,我必须使用connect函数(见上文)并将信号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");
}

问题出现了:我的textbrowser ONLY 显示最后一个emit-command“Socket closed”。我调试程序,点击startbutton(启动服务器并将信号(updateUI)与插槽(appendToBrowser)连接)并通过telnet连接到程序。 该程序到目前为止工作正常,我看到“你好客户端”和telnet上的退出,但仍然只有最后一个发射输出通过“Socked Closed”。 在第一个时刻,我认为我的发射可能会互相覆盖,但这不可能导致在我点击startButton之后应该看到“服务器启动”或“服务器错误”。

任何想法如何解决这个问题?我现在正在使用c ++和qt工作大约3周,我必须承认我很快就会感到很困惑,所以我希望你们能理解我的问题!谢谢到目前为止。

1 个答案:

答案 0 :(得分:1)

这很正常,如果你在MyServer的构造函数中建立连接,你还没有将它的信号连接到主窗口,所以它不会显示合成。

一个基本的修复方法是将连接代码(至少是if / else部分)移动到一个方法中,并在MainWindow :: on_startButton_clicked()插槽中将各个东西连接在一起后调用该方法......