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
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


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


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




RSS Текстовая версия Сейчас: 19.12.2024, 1:03