Russian Qt Forum
Ноябрь 24, 2024, 16:27 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: В конструктор родителя передать имя объекта  (Прочитано 11504 раз)
Alex_C
Гость
« : Апрель 14, 2012, 22:55 »

Нужно что то типа такого:

Код:
CalcWindow::CalcWindow(QSettings *s,
                       bool isModal,
                       QWidget *parent) :
    AbstractLogWindow(this->objectName(), s, isModal, parent)

Однако, этот код вызывает ошибку - ведь здесь так this->objectName() имя класса передать нельзя. А как можно?
Мне это имя нужно в конструкторе родителя.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Апрель 14, 2012, 23:21 »

родитель и сам в состоянии запросить objectName
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Alex_C
Гость
« Ответ #2 : Апрель 15, 2012, 10:17 »

Я пока нашел, что родитель может запросить только children() - список наследуемых от него классов. А вот определить - какой конкретно наследник вызвал - конструктор - пока не нашел.
Записан
alexis031182
Гость
« Ответ #3 : Апрель 15, 2012, 10:35 »

Но ведь Вы хотите передать имя конкретного класса потомка предку при их создании, так? Так почему бы просто строку не передать? Имя Вам в данной ситуации однозначно известно.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Апрель 15, 2012, 10:36 »

Я пока нашел, что родитель может запросить только children() - список наследуемых от него классов. А вот определить - какой конкретно наследник вызвал - конструктор - пока не нашел.
Хотя это можно сделать финтом, это сложно и опасно. См детали здесь
http://www.prog.org.ru/index.php?topic=21516.msg149271#msg149271

Обычно делают виртуальный метод (часто называют Init()) который вызывают сразу после конструктора
Записан
Alex_C
Гость
« Ответ #5 : Апрель 15, 2012, 10:53 »

Спасибо за ответы!
То alexis031182: естественно, имя класса-потомка я знаю. Я в первом посте и спросил - как конструктору-родителю передать строку? Я там привел "попытку" это сделать.
То Igors: прочитал. И все больше думаю, что то, что я хочу сделать, а вернее как я это хочу сделать - мягко скажем не верное направление деятельности.

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

Код:
AbstractLogWindow::AbstractLogWindow(QString winName,
                                     QSettings *s,
                                     bool isModal,
                                     QWidget *parent) :
QWidget(parent)
{
    m_WinSet = s;
    m_WinName = winName;
   
    uint winState = (isModal? Qt::Dialog : Qt::Window);

    m_WinSet->beginGroup(m_WinName);
    setGeometry(m_WinSet->value("Geometry", geometry()).toRect());
    setWindowFlags(Qt::WindowFlags(m_WinSet->value("WondowFlags", winState).toUInt()));
    m_WinSet->endGroup();
}

AbstractLogWindow::~AbstractLogWindow()
{
    m_WinSet->beginGroup(m_WinName);
    m_WinSet->setValue("Geometry", geometry());
    m_WinSet->setValue("WondowFlags", uint(windowFlags()));
    m_WinSet->endGroup();
}

Идея думаю понятна.
Вот для этого мне и нужно имя класса-потомка.
Записан
alexis031182
Гость
« Ответ #6 : Апрель 15, 2012, 11:00 »

Прошу извинить, что может быть туплю, но мне просто интересно, почему нельзя сделать вот так:
Код:
CalcWindow::CalcWindow(QSettings *s, bool isModal, QWidget *parent) :
   AbstractLogWindow("CalcWindow", s, isModal, parent)
И соответственно в любом классе потомке подставлять строку с именем потомка
Записан
mutineer
Гость
« Ответ #7 : Апрель 15, 2012, 11:13 »

Я пока нашел, что родитель может запросить только children() - список наследуемых от него классов. А вот определить - какой конкретно наследник вызвал - конструктор - пока не нашел.

Ты бы разобрал кашу в голове - children() возвращает совсем не список наследуемых классов, а список дочерних объектов. Что суть абсолютно разные вещи
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Апрель 15, 2012, 11:25 »

Уберите "паскалевские уши"
Код
C++ (Qt)
AbstractLogWindow::AbstractLogWindow(QString winName,  // ненужная подача по значению
AbstractLogWindow::AbstractLogWindow(const QString & winName,  // на плюсах так
 

Возвращаясь к теме - а чего Вы так настойчиво хотите воткнуть создание лога в базовый конструктор? Действительно ли это свойство "базовое"? Все-все созданные экземпляры будут иметь логи - не многовато ли? Более реалистично так
Код
C++ (Qt)
CalcWindow * calc = new CalcWindow(.. );
calc->LoadSettings(...);
 
А то боретесь за то чтобы записать это одной строкой - и теряете при этом всю гибкость

Edit: тут я сам маленько запутался - AbstractLogWindow ввело в заблуждение, подумал что это лог-окно  Улыбающийся
« Последнее редактирование: Апрель 15, 2012, 11:58 от Igors » Записан
alexis031182
Гость
« Ответ #9 : Апрель 15, 2012, 11:40 »

Код:
CalcWindow::CalcWindow(QSettings *s, bool isModal, QWidget *parent) :
   AbstractLogWindow("CalcWindow", s, isModal, parent)
И соответственно в любом классе потомке подставлять строку с именем потомка
Так ведь AbstractLogWindow - это просто др окно, а не базовый класс

...
Напишу тогда что хочу сделать: хочу сделать класс-предок, для всех окон моей программы (их много). Одной из задач, которые должен выполнять этот предок - сохранение положения и т.п. установок окна в ini-файле.
...
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Апрель 15, 2012, 12:21 »

alexis031182, Вы правы, человек действительно хотел сделать базовый класс. Однако затея неудачна, конструктор смотрится коряво
Код
C++ (Qt)
CalcWindow::CalcWindow(QSettings *s, bool isModal, QWidget *parent) :
 
Нужны ли (необходимы) QSettings, isModal самому CalcWindow? Какая ф-циональность AbstractLogWindow кроме одного действия в конструкторе? Пока видно что это явно метод, а не базовый класс

Записан
Alex_C
Гость
« Ответ #11 : Апрель 15, 2012, 19:45 »

Ребят. Без обид - сколько я ссорился на Дельфийских форумах))) Да у меня весьма своеобразная задача))) Но она достаточно популярна "в узких кругах специалистов". Просто по другому - нет смысла писать (моя программа бесплатна - есть другие аналоги). Ей просто не будут пользоваться, если я не сделаю некоторые пользовательские возможности.
На счет "нужны ли" - коротко - ДА. Я ведь прежде всего для себя пишу - программа бесплатна - пишется для удовольствия. Тем кому интересно - пишите на емайл. Поговорим)))

Теперь о программе: в программе около 30 окон - нужно позицию каждого окна сохранять и т.п. Разве моя идея не правильна?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Апрель 15, 2012, 20:27 »

Просто по другому - нет смысла писать (моя программа бесплатна - есть другие аналоги). Ей просто не будут пользоваться, если я не сделаю некоторые пользовательские возможности.
На счет "нужны ли" - коротко - ДА. Я ведь прежде всего для себя пишу - программа бесплатна - пишется для удовольствия. Тем кому интересно - пишите на емайл. Поговорим)))

Теперь о программе: в программе около 30 окон - нужно позицию каждого окна сохранять и т.п. Разве моя идея не правильна?
Никто не пытается доказать что сохранение/восстановление позиции/свойств окон "не нужно". Во всяком случае это Вам виднее. Обсуждается только "как это сделать". Так вот, через базовый класс - плохо. Хоть это и не смертельная ошибка, но Вы просто начнете испытывать некоторые неудобства, и чем дальше - тем больше. Напр Вам придется всегда иметь QSettings чтобы создать окно. Придется откуда-то (искусственно) извлекать имя (чтобы подать его в конструктор) и.т.п

Ребят. Без обид
Эх, как было бы здорово если все вокруг были бы свои "ребят"  Улыбающийся Но увы, обычно это люди очень разного круга/интересов, поэтому лучше не быть таким фамильярным
Записан
Alex_C
Гость
« Ответ #13 : Апрель 15, 2012, 20:41 »

Обсуждается только "как это сделать". Так вот, через базовый класс - плохо. Хоть это и не смертельная ошибка, но Вы просто начнете испытывать некоторые неудобства, и чем дальше - тем больше. Напр Вам придется всегда иметь QSettings чтобы создать окно. Придется откуда-то (искусственно) извлекать имя (чтобы подать его в конструктор) и.т.п

Так я по этому тут и спрашиваю)) Программа то уже есть. В общем то готовая и хорошая. Бесплатная. Я теперь хочу:
1. Сделать ее кросс-платформенной.
2. В принципе сделать ее в "правильном стиле".
Пока не понимаю, о чем Вы говорите - да, прийдется всегда иметь QSettings - а как иначе? И т.п. Вот и думаю - как лучше?
Записан
Alex_C
Гость
« Ответ #14 : Апрель 15, 2012, 20:43 »

Эх, как было бы здорово если все вокруг были бы свои "ребят"  Улыбающийся Но увы, обычно это люди очень разного круга/интересов, поэтому лучше не быть таким фамильярным

Прошу прощения. Я сам уже не молод)) Но вырос в социализме - где все "свои ребята"))) Прошу прощения. Ошибку принял к сведению.
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.156 секунд. Запросов: 23.