Название: Доступ к UI из другого класса Отправлено: WebMaster от Сентябрь 21, 2016, 09:53 Помогите получить доступ к UI из другого класса.
(http://s017.radikal.ru/i439/1609/98/7043f3aa0d79.png) main.cpp Код: #include "mainwindow.h" mainwindows.cpp Код: #include "mainwindow.h" mainwindows.h Код: #ifndef MAINWINDOW_H log.cpp Код: #include "logs.h" logs.h Код: #ifndef LOGS_H Название: Re: Доступ к UI из другого класса Отправлено: gil9red от Сентябрь 21, 2016, 10:44 Ленивый вариант:
В MainWindow делаете ui публичным и в void logs::clear() обращаетесь к полю ui: Код
Правильный вариант: В 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 добавьте метод, который будет принимать сообщения и добавлять в интересующий виджет на форме.
Например Код
Название: Re: Доступ к UI из другого класса Отправлено: WebMaster от Сентябрь 21, 2016, 12:51 Метод уже добавлен.
Код: void MainWindow::plainTextEditEventLogClear() Название: Re: Доступ к UI из другого класса Отправлено: __Heaven__ от Сентябрь 21, 2016, 13:20 Добавлен метод очистки.
Ну вот и вызывайте его из других классов. Можно его оформить слотом и связать с сигналами классов. Название: Re: Доступ к UI из другого класса Отправлено: WebMaster от Сентябрь 21, 2016, 13:53 Я не правильно его вызываю?
Код: void logs::clear() Название: 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" Название: Re: Доступ к UI из другого класса Отправлено: __Heaven__ от Сентябрь 21, 2016, 16:19 Не то. Не нужны вам глобальные переменные. Предлагаю унаследовать log от QObject и создать ему сигнал clearRequired. Этот сигнал связать с очисткой главного окна.
вариант 2 (не рекомендую): в лог передать указатель на главное окно и по нему вызвать интересующий метод объекта Название: Re: Доступ к UI из другого класса Отправлено: Igors от Сентябрь 22, 2016, 08:53 Вынес в глобальную переменную MainWindow *w = NULL; но не пойму как обратится к переменной из класса logs. В mainwindow.h добавьтеКод и включите этот хедер в cpp где нужно обращаться Код Ну имя "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) |