Автор: Maksus 8.5.2009, 23:16
Немогу понять как осуществляется доступ к элементам (виджетам) дочернего окна созданного с помощью Классов форм (именно классов, а не просто форм). Какой способ встраивания Ui и для каких случаев лучше выбрать aggregation, aggregation as pointer или multiple inheritance? В документации ничего нет про это, а в книгах более старые версии Qt тогда еще небыло QtCreator`а и готовых классов форм.
Автор: SABROG 8.5.2009, 23:25
Цитата(Maksus @ 9.5.2009, 0:16)
именно классов, а не просто форм
Что такое "просто форма" и что такое "класс формы"?
Я знаю лишь, что любой виджет, даже созданный через дизайнер - является классом. А у любого класса есть поля со свойствами и дочерними элементами. Но что-то мне подсказывает, что затык с пониманием произошел из-за ui компилятора, который делает всю работу за кадром (это к теме о ui_*.h файлах).
Автор: Kagami 8.5.2009, 23:38
Применив телепатию, понял следующее. Вопрос заключается в том, какой подход лучше - описанный в книге Жасмин Бланшет:
#include "ui_newdlg.h"
class NewDlg : public QDialog, public Ui::NewDlg
{
...
};
или подход, который предлагается QtCreater'ом при создании нового проекта:
#include "ui_mainwindow.h"
class MainWindow : public QMainWindow
{
...
private:
Ui::MainWindow *ui;
};
Автор: Maksus 8.5.2009, 23:55
Цитата(Kagami @ 8.5.2009, 23:38)
Применив телепатию, понял следующее. Вопрос заключается в том, какой подход лучше - описанный в книге Жасмин Бланшет:
#include "ui_newdlg.h"
class NewDlg : public QDialog, public Ui::NewDlg
{
...
};
или подход, который предлагается QtCreater'ом при создании нового проекта:
#include "ui_mainwindow.h"
class MainWindow : public QMainWindow
{
...
private:
Ui::MainWindow *ui;
};
да, да, да
плюс есть еще третий, как ваш второй, только ui создается статически.
Речь не идет о новом проекте в Creator, там выбора нет, да и все елементы доступны через *ui.
Попробуйте в чистый проект от Creator добавить форму класса (там есть такой выбор, и это не тоже самое, что просто форма). И тогда если нажмете more в мастере то увидите те самые варинты о которых выше написано. Собсно вопрос в том, какой вариант лучше и как же всетаки получить доступ к элементам этого новосозданного класс (с формой) и базового, основного (main).
из базового, основного (main).
Автор: defnull 9.5.2009, 0:38
На мой взгляд лучше всего наследование.. тоесть:
class MainWindow : public QMainWindow, public Ui::MainWindow
{
...
};
в конструкторе потом просто setup(this) и в принципе всё... через this обращаться к любому элементу UI-шки... ну по крайней мере мне так удобнее=)
Автор: Maksus 9.5.2009, 1:47
Цитата(defnull @ 9.5.2009, 0:38)
На мой взгляд лучше всего наследование.. тоесть:
class MainWindow : public QMainWindow, public Ui::MainWindow
{
...
};
в конструкторе потом просто setup(this) и в принципе всё... через this обращаться к любому элементу UI-шки... ну по крайней мере мне так удобнее=)
Да но обратиться к элементам экземпляра такого класса извне неудается, даже когда идет public наследование по обоим предкам (Creator формирует наследование
public QWidget, private Ui::Form
Автор: Kagami 9.5.2009, 8:23
Ну с одной стороны это правильно - реализуется принцип инкапсуляции. Если нужен доступ - либо пишем соответствующий метод, либо через сигналы/слоты. Необходимость что-то менять извне формы возникает очень редко и легко решается этими двумя способами.
Автор: SABROG 9.5.2009, 10:11
У варианта "с указателем" есть плюс - можно отложить на время создание дочерних элементов, но при этом пользоваться сигналами и слотами.
Скажем вывести диалог авторизации и при правильном ответе начать формировать главную форму.
Автор: Maksus 9.5.2009, 13:07
Цитата(SABROG @ 9.5.2009, 10:11)
У варианта "с указателем" есть плюс - можно отложить на время создание дочерних элементов, но при этом пользоваться сигналами и слотами.
Скажем вывести диалог авторизации и при правильном ответе начать формировать главную форму.
Спасибо! Какие еще есть плюсы и минусы разных методов?