crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Классы форм и наледование ui
Maksus
  опции профиля:
сообщение 8.5.2009, 23:16
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 18
Регистрация: 14.4.2009
Пользователь №: 679

Спасибо сказали: 0 раз(а)




Репутация:   0  


Немогу понять как осуществляется доступ к элементам (виджетам) дочернего окна созданного с помощью Классов форм (именно классов, а не просто форм). Какой способ встраивания Ui и для каких случаев лучше выбрать aggregation, aggregation as pointer или multiple inheritance? В документации ничего нет про это, а в книгах более старые версии Qt тогда еще небыло QtCreator`а и готовых классов форм.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 8.5.2009, 23:25
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Цитата(Maksus @ 9.5.2009, 0:16) *
именно классов, а не просто форм


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

Я знаю лишь, что любой виджет, даже созданный через дизайнер - является классом. А у любого класса есть поля со свойствами и дочерними элементами. Но что-то мне подсказывает, что затык с пониманием произошел из-за ui компилятора, который делает всю работу за кадром (это к теме о ui_*.h файлах).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Kagami
  опции профиля:
сообщение 8.5.2009, 23:38
Сообщение #3


Старейший участник
****

Группа: Участник
Сообщений: 601
Регистрация: 2.2.2009
Пользователь №: 523

Спасибо сказали: 101 раз(а)




Репутация:   9  


Применив телепатию, понял следующее. Вопрос заключается в том, какой подход лучше - описанный в книге Жасмин Бланшет:
Раскрывающийся текст
#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
Сообщение #4


Студент
*

Группа: Новичок
Сообщений: 18
Регистрация: 14.4.2009
Пользователь №: 679

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(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
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 49
Регистрация: 1.5.2008
Пользователь №: 165

Спасибо сказали: 0 раз(а)




Репутация:   1  


На мой взгляд лучше всего наследование.. тоесть:

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

в конструкторе потом просто setup(this) и в принципе всё... через this обращаться к любому элементу UI-шки... ну по крайней мере мне так удобнее=)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Maksus
  опции профиля:
сообщение 9.5.2009, 1:47
Сообщение #6


Студент
*

Группа: Новичок
Сообщений: 18
Регистрация: 14.4.2009
Пользователь №: 679

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(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
Сообщение #7


Старейший участник
****

Группа: Участник
Сообщений: 601
Регистрация: 2.2.2009
Пользователь №: 523

Спасибо сказали: 101 раз(а)




Репутация:   9  


Ну с одной стороны это правильно - реализуется принцип инкапсуляции. Если нужен доступ - либо пишем соответствующий метод, либо через сигналы/слоты. Необходимость что-то менять извне формы возникает очень редко и легко решается этими двумя способами.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 9.5.2009, 10:11
Сообщение #8


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


У варианта "с указателем" есть плюс - можно отложить на время создание дочерних элементов, но при этом пользоваться сигналами и слотами.
Скажем вывести диалог авторизации и при правильном ответе начать формировать главную форму.

Сообщение отредактировал SABROG - 9.5.2009, 10:14
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Maksus
  опции профиля:
сообщение 9.5.2009, 13:07
Сообщение #9


Студент
*

Группа: Новичок
Сообщений: 18
Регистрация: 14.4.2009
Пользователь №: 679

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(SABROG @ 9.5.2009, 10:11) *
У варианта "с указателем" есть плюс - можно отложить на время создание дочерних элементов, но при этом пользоваться сигналами и слотами.
Скажем вывести диалог авторизации и при правильном ответе начать формировать главную форму.

Спасибо! Какие еще есть плюсы и минусы разных методов?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 26.6.2022, 14:26