Russian Qt Forum

Qt => Вопросы новичков => Тема начата: WebMaster от Сентябрь 21, 2016, 09:53



Название: Доступ к UI из другого класса
Отправлено: WebMaster от Сентябрь 21, 2016, 09:53
Помогите получить доступ к UI из другого класса.

(http://s017.radikal.ru/i439/1609/98/7043f3aa0d79.png)

main.cpp
Код:
#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

mainwindows.cpp
Код:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "logs.h"

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

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

void MainWindow::plainTextEditEventLogClear()
{
    qDebug() << "plainTextEditEventLogClear()";
    ui->plainTextEdit->clear();
}

void MainWindow::on_pushButton_clicked()
{
    logs log;
    log.clear();
}

void MainWindow::on_pushButton_2_clicked()
{
    ui->plainTextEdit->appendPlainText("append text");
}

mainwindows.h
Код:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QDebug>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    void plainTextEditEventLogClear();

private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

log.cpp
Код:
#include "logs.h"
#include "mainwindow.h"

logs::logs()
{

}

void logs::clear()
{
    qDebug() << "logs::clear()";
    MainWindow mw;
    mw.plainTextEditEventLogClear();
}

logs.h
Код:
#ifndef LOGS_H
#define LOGS_H


class logs
{
public:
    logs();
    void clear();
};

#endif // LOGS_H


Название: Re: Доступ к UI из другого класса
Отправлено: gil9red от Сентябрь 21, 2016, 10:44
Ленивый вариант:
В MainWindow делаете ui публичным и в void logs::clear() обращаетесь к полю ui:

Код
C++ (Qt)
   MainWindow mw;
   mw.ui->label_1->clear();

Правильный вариант:
В MainWindow создаете методы, через которые дается доступ к нужному виджету на форме, или меняется поведение этого виджета (типа очистить список)

Еще, у вас в функциях используются объекты (в on_pushButton_clicked logs, в logs::clear MainWindow) и они существуют только в пределах этих функций, и сразу же уничтожаются при выходе из них (привет, созданные на стеке объекты), мне кажется это не то, что вам хотелось :)


Название: Re: Доступ к UI из другого класса
Отправлено: WebMaster от Сентябрь 21, 2016, 11:11
Можете подправить мой пример на правильный вариант, так не очень понятно?


Название: Re: Доступ к UI из другого класса
Отправлено: __Heaven__ от Сентябрь 21, 2016, 11:34
Поправить ваш пример будет непедагогично. Для каких целей нужен доступ в ui?


Название: Re: Доступ к UI из другого класса
Отправлено: WebMaster от Сентябрь 21, 2016, 11:39
Нужно писать в plainText из других классов - эти типо журнал событий.


Название: Re: Доступ к UI из другого класса
Отправлено: __Heaven__ от Сентябрь 21, 2016, 11:58
В класс MainWindow добавьте метод, который будет принимать сообщения и добавлять в интересующий виджет на форме.
Например
Код
C++ (Qt)
MainWindow::appendMessage(const QString &message);


Название: Re: Доступ к UI из другого класса
Отправлено: WebMaster от Сентябрь 21, 2016, 12:51
Метод уже добавлен.
Код:
void MainWindow::plainTextEditEventLogClear()
{
    qDebug() << "plainTextEditEventLogClear()";
    ui->plainTextEdit->clear();
}


Название: Re: Доступ к UI из другого класса
Отправлено: __Heaven__ от Сентябрь 21, 2016, 13:20
Добавлен метод очистки.
Ну вот и вызывайте его из других классов.
Можно его оформить слотом и связать с сигналами классов.


Название: Re: Доступ к UI из другого класса
Отправлено: WebMaster от Сентябрь 21, 2016, 13:53
Я не правильно его вызываю?
Код:
void logs::clear()
{
    qDebug() << "logs::clear()";
    MainWindow mw;
    mw.plainTextEditEventLogClear();
}


Название: Re: Доступ к UI из другого класса
Отправлено: __Heaven__ от Сентябрь 21, 2016, 14:07
Вызываете-то вы всё правильно. Но обратите внимание на то, что на экран в виде формы выводится объект w из main.cpp, а чистку вы производите в объекте mw из метода logs::clear()


Название: Re: Доступ к UI из другого класса
Отправлено: WebMaster от Сентябрь 21, 2016, 15:29
Вынес в глобальную переменную MainWindow *w = NULL; но не пойму как обратится к переменной из класса logs.

Код:
#include "mainwindow.h"
#include <QApplication>

MainWindow *w = NULL;

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    w = new MainWindow;
    w->show();

    return a.exec();
}


Название: Re: Доступ к UI из другого класса
Отправлено: __Heaven__ от Сентябрь 21, 2016, 16:19
Не то. Не нужны вам глобальные переменные. Предлагаю унаследовать log от QObject и создать ему сигнал clearRequired. Этот сигнал связать с очисткой главного окна.

вариант 2 (не рекомендую): в лог передать указатель на главное окно и по нему вызвать интересующий метод объекта


Название: Re: Доступ к UI из другого класса
Отправлено: Igors от Сентябрь 22, 2016, 08:53
Вынес в глобальную переменную MainWindow *w = NULL; но не пойму как обратится к переменной из класса logs.
В mainwindow.h добавьте
Код
C++ (Qt)
extern MainWindow * w;
и включите этот хедер в cpp где нужно обращаться
Код
C++ (Qt)
w->plainTextEditEventLogClear();
Ну имя "w" конечно стыдуха, да и extern тоже, строго говоря, нехорошо - но работать будет. Более грамотные решения см выше, но они сложнее

И тыкаться в Qt без базовых знаний С/C++ получается всегда неудачно


Название: Re: Доступ к UI из другого класса
Отправлено: WebMaster от Сентябрь 22, 2016, 09:17
Igors, спасибо вам большое, очень помогли новичку!


Название: Re: Доступ к UI из другого класса
Отправлено: __Heaven__ от Сентябрь 22, 2016, 12:00
[facepalm]Судя по всему вы сделали extern[/facepalm]


Название: Re: Доступ к UI из другого класса
Отправлено: Bepec от Сентябрь 22, 2016, 13:47
Добрый Igors, направляет всех дорогой в пекло :D


Название: Re: Доступ к UI из другого класса
Отправлено: Igors от Сентябрь 22, 2016, 16:00
Добрый Igors, направляет всех дорогой в пекло :D
Конкретно Вас - значительно дальше


Название: Re: Доступ к UI из другого класса
Отправлено: Racheengel от Сентябрь 22, 2016, 16:57
Лучше тогда логгер сделать синглтоном.
Или статическим объектом.


Название: Re: Доступ к UI из другого класса
Отправлено: WebMaster от Сентябрь 23, 2016, 09:17
Сигналами и слотами не разобрался как сделать, щас через extern работает.


Название: Re: Доступ к UI из другого класса
Отправлено: __Heaven__ от Сентябрь 23, 2016, 09:23
Здесь (http://doc.qt.io/qt-5/signalsandslots.html) можно почитать про сигналы и слоты.
Подсказку я вам давал уже в #5 (http://www.prog.org.ru/index.php?topic=30622.msg226204#msg226204)