3

我通过 gui 拖放创建了一个按钮和一个文本浏览器。ui 是在 mainwindow.cpp 以及单击按钮功能中创建的。有一个 main.cpp 但这无关紧要,因为在单击开始按钮之前程序不会启动。

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "myserver.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_startButton_clicked()
{
    MyServer mServer;
}

到目前为止一切都很好,问题出在 myServer.cpp 中,我想通过ui->textBrowser->append("hello hello");. 但 myServer.cpp 类不“了解”用户界面。 "ui" not declared identifier

#include "myserver.h"
#include "mainwindow.h"


MyServer::MyServer(QObject *parent) :
    QObject(parent)
{
}

void MyServer::newConnection()
{
    server = new QTcpServer(this);

    connect(server,SIGNAL(newConnection()),this,SLOT(newConnection()));

    int ports = MainWindow::port();
    if(!server->listen(QHostAddress::Any,ports))
    {

    }
    else
    {
        //here is the problem
        ui->textBrowser->append("hallo hallo");
    }
}

通常我会创建一个新的(例如) MainWindow test;并通过它调用函数,test.function(); 但这在这里不起作用?

4

2 回答 2

5

首先,当您在 MainWindow::on_StartButtonClicked 函数中创建 MyServer 对象时,需要动态创建该对象,否则它将超出范围并被删除,但也许您只是在显示这个,而不是它的声明在 MainWindow 标题中。

至于您的问题,您的 UI 已连接到 MainWindow,因此请使用 Qt 的信号和插槽将来自 MyServer 对象的信号连接到 MainWindow 并将要显示的文本发送给它。然后 MainWindow 可以将它添加到 textBrowser。像这样的东西: -

void MainWindow::on_startButton_clicked()
{
    MyServer* mServer = new MyServer;
    connect(mServer SIGNAL(updateUI(const QString)), this, SLOT(AppendToBrowser(const QString)));
}

然后代替调用 ui->textBrowser->append("hallo hallo"); 在 newConnection 中,发出信号:-

emit updateUI("hallo hallo");

在 MainWindow 中,您将拥有 AppendToBrowser 功能:-

void MainWindow::AppendToBrowser(const QString text)
{
    ui->textBrowser->append(text);
}

或者,您可以将 UI 对象的指针传递给 MyServer 并从那里调用它,但信号和插槽方法更简洁。

=========== 编辑标题,以回应评论 ======================

//骨架我的服务器头

class MyServer : public QObject
{
    QOBJECT

    signals:
         void updateUI(const QString text);
};

// 骨架主窗口标题

class MainWindow : public QMainWindow
{
    private slots:
        void AppendToBrowser(const QString text);
};
于 2013-07-03T14:21:06.613 回答
1

您有 2 个选项:
1)将一个信号编码到 MyServer 类中,该类将更新 gui 所需的数据和一个插槽编码到 MainWindow 类中,该类执行更新 ui 并将信号与插槽连接的工作。

或 2)您可以将指向 MainWindow 的指针传递给 MyServer(也许作为父级有意义)并使用该指针调用您在 MainWindow 中编码的公共功能并使用您需要的数据更新 ui。

LE:两个问题:
1)我看到你在堆栈上创建了 MyServer 实例到 *on_startButton_clicked*,如果该对象被这么快销毁,这可能是一个问题,所以你应该确保只要你需要它就保持活动状态到,以便它可以完成它的工作。
2) 这条线应该做什么:connect(server,SIGNAL(newConnection()),this,SLOT(newConnection())); 即使你有一个 newConnection 信号,你为什么要将它连接到你连接的插槽以及它应该如何第一次连接,执行插槽并建立连接,所以检查你在那里做了什么......

于 2013-07-03T14:18:55.927 回答