Russian Qt Forum
Апрель 29, 2024, 14:27 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Доступ к UI из другого класса  (Прочитано 13987 раз)
WebMaster
Гость
« : Сентябрь 21, 2016, 09:53 »

Помогите получить доступ к UI из другого класса.



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
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Сентябрь 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) и они существуют только в пределах этих функций, и сразу же уничтожаются при выходе из них (привет, созданные на стеке объекты), мне кажется это не то, что вам хотелось Улыбающийся
Записан

WebMaster
Гость
« Ответ #2 : Сентябрь 21, 2016, 11:11 »

Можете подправить мой пример на правильный вариант, так не очень понятно?
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #3 : Сентябрь 21, 2016, 11:34 »

Поправить ваш пример будет непедагогично. Для каких целей нужен доступ в ui?
Записан
WebMaster
Гость
« Ответ #4 : Сентябрь 21, 2016, 11:39 »

Нужно писать в plainText из других классов - эти типо журнал событий.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #5 : Сентябрь 21, 2016, 11:58 »

В класс MainWindow добавьте метод, который будет принимать сообщения и добавлять в интересующий виджет на форме.
Например
Код
C++ (Qt)
MainWindow::appendMessage(const QString &message);
Записан
WebMaster
Гость
« Ответ #6 : Сентябрь 21, 2016, 12:51 »

Метод уже добавлен.
Код:
void MainWindow::plainTextEditEventLogClear()
{
    qDebug() << "plainTextEditEventLogClear()";
    ui->plainTextEdit->clear();
}
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #7 : Сентябрь 21, 2016, 13:20 »

Добавлен метод очистки.
Ну вот и вызывайте его из других классов.
Можно его оформить слотом и связать с сигналами классов.
Записан
WebMaster
Гость
« Ответ #8 : Сентябрь 21, 2016, 13:53 »

Я не правильно его вызываю?
Код:
void logs::clear()
{
    qDebug() << "logs::clear()";
    MainWindow mw;
    mw.plainTextEditEventLogClear();
}
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #9 : Сентябрь 21, 2016, 14:07 »

Вызываете-то вы всё правильно. Но обратите внимание на то, что на экран в виде формы выводится объект w из main.cpp, а чистку вы производите в объекте mw из метода logs::clear()
Записан
WebMaster
Гость
« Ответ #10 : Сентябрь 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();
}
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #11 : Сентябрь 21, 2016, 16:19 »

Не то. Не нужны вам глобальные переменные. Предлагаю унаследовать log от QObject и создать ему сигнал clearRequired. Этот сигнал связать с очисткой главного окна.

вариант 2 (не рекомендую): в лог передать указатель на главное окно и по нему вызвать интересующий метод объекта
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Сентябрь 22, 2016, 08:53 »

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

И тыкаться в Qt без базовых знаний С/C++ получается всегда неудачно
Записан
WebMaster
Гость
« Ответ #13 : Сентябрь 22, 2016, 09:17 »

Igors, спасибо вам большое, очень помогли новичку!
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #14 : Сентябрь 22, 2016, 12:00 »

[facepalm]Судя по всему вы сделали extern[/facepalm]
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.162 секунд. Запросов: 22.