Вызов графического интерфейса Qt c ++ из другого класса

Я создал кнопку и текстовый браузер с помощью перетаскивания GUI&понижаться.
пользовательский интерфейс создается в mainwindow.cpp, а также в функции click-button. Существует 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, где я хочу записать что-то в textBrowser через 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();
но это не работает здесь?

2

Решение

Прежде всего, когда вы создаете объект MyServer в функции MainWindow :: on_StartButtonClicked, объект должен создаваться динамически, иначе он выйдет из области видимости и будет удален, но, возможно, вы просто показываете это, а не его объявление в заголовке MainWindow.

Что касается вашего вопроса, ваш пользовательский интерфейс подключен к 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);
}

В качестве альтернативы, вы можете передать указатель объекта пользовательского интерфейса на MyServer и вызвать его оттуда, но метод сигналов и слотов намного чище.

=========== Отредактировано для заголовков, в ответ на комментарии ======================

// Скелет заголовка Мой сервер

class MyServer : public QObject
{
QOBJECT

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

// Скелетный заголовок MainWindow

class MainWindow : public QMainWindow
{
private slots:
void AppendToBrowser(const QString text);
};
4

Другие решения

У вас есть 2 варианта:
1) закодировать сигнал в класс MyServer, который передает данные, необходимые для обновления графического интерфейса пользователя и слота, в класс MainWindow, который выполняет работу по обновлению пользовательского интерфейса, и связывает сигнал со слотом.

или же
2) вы можете передать указатель на MainWindow в MyServer (возможно, имеет смысл быть родительским) и использовать этот указатель для вызова общедоступной функциональности, которую вы кодируете, в MainWindow и обновлять пользовательский интерфейс нужными вам данными.

LE: два вопроса:
1) я вижу, вы создаете экземпляр MyServer в стеке в * on_startButton_clicked *, это может быть проблемой, если этот объект разрушается так быстро, поэтому вы должны убедиться, что он остается в живых столько, сколько вам нужно, чтобы он может сделать это работа
2) что должна делать эта строка: подключения (сервер, SIGNAL (newConnection ()), это, SLOT (newConnection ())); даже если у вас есть сигнал newConnection, почему вы подключаете его в слот, к которому вы подключаетесь, и как он должен подключаться в первый раз, чтобы выполнить слот и установить соединение, так что проверьте, что вы там сделали …

1

По вопросам рекламы [email protected]