crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Наследование, Множественное наследование от QWidget
silver47
  опции профиля:
сообщение 19.1.2011, 16:17
Сообщение #1


Активный участник
***

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

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




Репутация:   6  


Доброго времени суток.

Задача такая: есть класс MainWindow, зависящий от QWidget. Есть другой класс, к примеру MainTab, который ставиться в QTabWidget, расположенного на MainWindow.
Необходимо предоставить доступ из класса MainTab к элементам класса MainWindow. Хотел сделать, унаследовав MainTab от MainWindow.

maintab.h:
#include <QWidget>
#include "mainwindow.h"

class MainTab : public QWidget, public MainWindow
{
....
};


Но, получается множественное наследование от QWidget (и MainWindow и MainTab наследуются от QWidget)
переделываю на такое:
#include <QWidget>
#include "mainwindow.h"

class MainTab : public MainWindow
{
....
};

Ругается, что не указан класс до {

Сделал передачей указателей на необходимые элементы класса MainWindow в конструктор MainTab.

Вопрос: как следует это делать(не передачу указателя в конструкторе, а обращение к элементам одного класса из другого) правильно?

Спасибо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 19.1.2011, 16:47
Сообщение #2


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

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

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




Репутация:   7  


А зачем MainTab-у наследоваться от QWidget, если MainWindow итак от него унаследован через QMainWidget?

Так получилось сделать или ругается? Если ругается, приведи больше кода тогда. А по-поводу передачи данных, я обычно так и делаю. Протаскиваю указатель на класс и через него уже получаю то, что нужно. Более извращенный вариант - создать один (или два) абстактных класса, и сделать их предками твоих классов. У наследников должна быть имплементация виртуальных методов базовых классов. Но от указателей никуда не деться. Правда они в этом случае уже будут не указателями на сами класс, а указателями на интерфейсы. Таким образом кроме тех функций, которые объявлены в базовых классах, твои классы ничего другого и знать не будут. Этот метод я использую, когда требуется вынести часть функционала в другую библиотеку например (в рамках одного проекта это делать имхо не следует). Хотя, вероятно, лучше было бы использовать механизм плагинов. Ну а так получается аналог COM по сути.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 19.1.2011, 17:07
Сообщение #3


Активный участник
***

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

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




Репутация:   6  


Нет, Вы не поняли. MainWidget - это мой класс с главным окном. Помимо всего прочего на нем есть QTabWidget на котором на месте табов свои классы. Сколько закладок - столько классов, конструкторы которых находятся внутри конструктора MainWidget. На прилагаемом рисунке внешний вид приложения. То есть mainTab и другие табы создаются в конструкторе MainWindow, который и есть главное окно приложения. Необходим полный доступ к некоторым компонентам класса MainWindow таким как (QSqlDatabase, QComboBox). Их приличное количество (только открытых баз данных 3-4 штуки). Отнаследовать все классы табов от MainWidget не получилось, говорит что класс не указан. Передаю в конструкторе табов указатели на базы данных и необходимые компоненты. Считаю, что такой способ не самый худший, т.к. новые объекты не создаются, а создаются лишь указатели на них, но хочу услышать совет опытных.

P.S. для каждого таба свой класс решил сделать потому, что слишком сложное приложение по структуре получается (весь интерфейс пишу руками). Нарисовал главное окно и 2 вкладки > 1000 строк в MainWindow. Вкладок будет штук 6 и логика работы программы сложная - боюсь запутаться в > 10к строк

Сообщение отредактировал silver47 - 19.1.2011, 17:14
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 19.1.2011, 17:22
Сообщение #4


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

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

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




Репутация:   29  


Цитата(silver47 @ 19.1.2011, 16:17) *
Задача такая: есть класс MainWindow, зависящий от QWidget. Есть другой класс, к примеру MainTab, который ставиться в QTabWidget, расположенного на MainWindow.
Необходимо предоставить доступ из класса MainTab к элементам класса MainWindow. Хотел сделать, унаследовав MainTab от MainWindow.
теоритически, если бы такая конструкция была возможна, доступа до нужных вам данных вы бы не получили. Существующий MainWindow и тот что создастся при создании MainTab - это два разных объекта одного типа. Соответственно у каждого из них свой набор данных, никак не связанных (если конечно они не статические, что врят ли)

Решений можно придумать много. Можно передать указатель MainWindow в MainTab, и получать доступ к нужным данным через интерфейс MainWindow.
Можно, как ты и сделал, в конструкторе передавать необходимые данные. Если данных много, это может быть неудобным, тогда можно написать пару функций для передачи этих данных (что то типа setSqlDatabase).

P.S. И совет, учите с++. Название темы, как раз то с чего можно начать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 19.1.2011, 17:26
Сообщение #5


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

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

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




Репутация:   7  


Вот теперь точно непонял.
Цитата
Сколько закладок - столько классов, конструкторы которых находятся внутри конструктора MainWidget

Это что имеется ввиду? Экземпляры классов создаются в конструкторе MainWidget?

Имхо тут наследование вообще не нужно. Оно усложнит только. К тому же, насколько я понимаю, вообще намного более предпочтительней использовать указатель, чем наследование (указатель обернутый в какой-нить QPointer например, в зависимости от того, что нужно). Если __злоупотреблять__ наследованием - это лишнее расходовние памяти, ухудшение скорости работы программы, усложнение кода. Да и прямой доступ я бы вообще не стал давать к QComboBox и пр. Если MainWidget им владеет, значит только он должен знать, как и что туда добавлять. Поэтому с т.з. проектирования лучше написать метод MainWidget::addComboBoxData(...) и т.п.

Насчет БД... Куда столько? с таблицами не путаете? Это тоже не есть хорошо, когда у одной программы - 5-10 баз данных... Пусть хоть 10000 таблиц - но в одной базе.

По-поводу передачи указателей. Для удобства можно обернуть их в отдельную структуру. Если добавите/удалите какой-нить виджет/БД/еще что-нибудь придется переписывать конструкторы, добавлять новые переменные в классы, которые их будут использовать. А так в одном-двух местах подправил и все (занес в структуру и инициализировал). Масштабируемость какжется называется. Плюс читаемость лучше. Вобщем, мои мысли такие =)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 19.1.2011, 17:41
Сообщение #6


Активный участник
***

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

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




Репутация:   6  


Цитата(Rocky @ 19.1.2011, 19:26) *
Это что имеется ввиду? Экземпляры классов создаются в конструкторе MainWidget?

Да, именно так.

Цитата(Rocky @ 19.1.2011, 19:26) *
Куда столько? с таблицами не путаете?

Нет, не путаю. 2 Базы - те над которыми работаем. Остальные две это мои кеши. Одна в памяти, для быстро меняющихся данных, другая - на локальном диске - для медленно меняющихся (работает как кеш браузера: сначала из кеша - потом снаружи).

Цитата(Rocky @ 19.1.2011, 19:26) *
Поэтому с т.з. проектирования лучше написать метод MainWidget::addComboBoxData(...) и т.п.

В этом проекте не вижу необходимости - лишь усложнит.

Цитата(Rocky @ 19.1.2011, 19:26) *
Для удобства можно обернуть их в отдельную структуру.

Не дорос ещё(самоучка), не знаю как сделать.

Итог: при малом количестве объектов - использовать передачу указателей на объекты, при бОльшем - передачу указателя на виджет.
Спасибо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




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