Я создал кнопку и текстовый браузер с помощью перетаскивания 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();
но это не работает здесь?
Прежде всего, когда вы создаете объект 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);
};
У вас есть 2 варианта:
1) закодировать сигнал в класс MyServer, который передает данные, необходимые для обновления графического интерфейса пользователя и слота, в класс MainWindow, который выполняет работу по обновлению пользовательского интерфейса, и связывает сигнал со слотом.
или же
2) вы можете передать указатель на MainWindow в MyServer (возможно, имеет смысл быть родительским) и использовать этот указатель для вызова общедоступной функциональности, которую вы кодируете, в MainWindow и обновлять пользовательский интерфейс нужными вам данными.
LE: два вопроса:
1) я вижу, вы создаете экземпляр MyServer в стеке в * on_startButton_clicked *, это может быть проблемой, если этот объект разрушается так быстро, поэтому вы должны убедиться, что он остается в живых столько, сколько вам нужно, чтобы он может сделать это работа
2) что должна делать эта строка: подключения (сервер, SIGNAL (newConnection ()), это, SLOT (newConnection ())); даже если у вас есть сигнал newConnection, почему вы подключаете его в слот, к которому вы подключаетесь, и как он должен подключаться в первый раз, чтобы выполнить слот и установить соединение, так что проверьте, что вы там сделали …