Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Классы форм и наледование ui
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt GUI
Maksus
Немогу понять как осуществляется доступ к элементам (виджетам) дочернего окна созданного с помощью Классов форм (именно классов, а не просто форм). Какой способ встраивания Ui и для каких случаев лучше выбрать aggregation, aggregation as pointer или multiple inheritance? В документации ничего нет про это, а в книгах более старые версии Qt тогда еще небыло QtCreator`а и готовых классов форм.
SABROG
Цитата(Maksus @ 9.5.2009, 0:16) *
именно классов, а не просто форм


Что такое "просто форма" и что такое "класс формы"?

Я знаю лишь, что любой виджет, даже созданный через дизайнер - является классом. А у любого класса есть поля со свойствами и дочерними элементами. Но что-то мне подсказывает, что затык с пониманием произошел из-за ui компилятора, который делает всю работу за кадром (это к теме о ui_*.h файлах).
Kagami
Применив телепатию, понял следующее. Вопрос заключается в том, какой подход лучше - описанный в книге Жасмин Бланшет:
Раскрывающийся текст
#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
Цитата(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
На мой взгляд лучше всего наследование.. тоесть:

class MainWindow : public QMainWindow, public Ui::MainWindow
{
...
};

в конструкторе потом просто setup(this) и в принципе всё... через this обращаться к любому элементу UI-шки... ну по крайней мере мне так удобнее=)
Maksus
Цитата(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
Ну с одной стороны это правильно - реализуется принцип инкапсуляции. Если нужен доступ - либо пишем соответствующий метод, либо через сигналы/слоты. Необходимость что-то менять извне формы возникает очень редко и легко решается этими двумя способами.
SABROG
У варианта "с указателем" есть плюс - можно отложить на время создание дочерних элементов, но при этом пользоваться сигналами и слотами.
Скажем вывести диалог авторизации и при правильном ответе начать формировать главную форму.
Maksus
Цитата(SABROG @ 9.5.2009, 10:11) *
У варианта "с указателем" есть плюс - можно отложить на время создание дочерних элементов, но при этом пользоваться сигналами и слотами.
Скажем вывести диалог авторизации и при правильном ответе начать формировать главную форму.

Спасибо! Какие еще есть плюсы и минусы разных методов?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.