3

GUIドラッグ&ドロップでボタンとテキストブラウザを作成しました。UI は mainwindow.cpp とクリックボタン関数で作成されます。main.cpp がありますが、それは無関係な原因であり、startbutton がクリックされるまでプログラムは起動しません。

#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 で、何かを経由して textBrowser に書き込もうとしていui->textBrowser->append("hello hello");ます。しかし、myServer.cpp クラスは ui を「認識」していません。 "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

1

2 つのオプションがあります
。1) GUI の更新に必要なデータを渡す MyServer クラスに信号をコーディングし、UI の更新作業を行い、信号をスロットに接続する MainWindow クラスにスロットをコーディングします。

または 2) MainWindow へのポインターを MyServer に渡し (おそらく親であることが理にかなっています)、そのポインターを使用して、MainWindow にコーディングし、必要なデータで ui を更新するパブリック機能を呼び出します。

LE: 2 つの問題:
1) スタック上の MyServer インスタンスを *on_startButton_clicked* に作成しているのがわかります。これは、そのオブジェクトがすぐに破棄された場合に問題になる可能性があるため、必要な限り存続することを確認する必要があります。に、それが仕事をすることができるように。
2) この行は何をすべきか: connect(server,SIGNAL(newConnection()),this,SLOT(newConnection())); newConnection 信号がある場合でも、接続するスロットにそれを接続する理由と、最初に接続する方法、スロットを実行して接続を確立する方法、そこで行ったことを確認してください...

于 2013-07-03T14:18:55.927 に答える