LINUX.ORG.RU

QObject::finChild и QList


0

0

Здравствуйте товарищи!

Моя проблема: имеется класс CControls(наследник от QObject), который содержит в себе множество членов класса QList.

В какой-то момент мне нужен один из членов ССontrols по устровию строки QString.

Чтобы не писать множества строк вида if (string == "название_члена_CControls") return CControls.нужный_член;

я решил использовать QObject::findChild() и столкнулся с следующей проблемой.

QList - не является наследником QObject и на моей строке кода QStringList* listNames = findChild<QStringList *>(ChildName);

компилятор ругается: 'class QStringList' has no member named 'staticMetaObject', как раз по причине того что QList - не наследник QObject.

Что же делать? не размножать же if'ы ?


поправка!

QStringList наследник QSignalSpy, а тот уже наследник QObject. НО, почему-то, автодополнение на член QStringList не показывает методы Qbject.

Народ, помогите а =(

Arxell
() автор топика

QObject::findChild() ищет Qt'шные объекты, для которых текущий является родительским (с точки зрения иерархии Qt'шных объектов). Это не имеет никакого отношения к твоей задаче.

mannaz
()

Почитай про Qt properties - скорее всего ты найдешь нужное там. Я, честно говоря, уже хреново помню, что там к чему.

mannaz
()
Ответ на: комментарий от mannaz

да как же?

пример в асистанте QPushButton *button = parentWidget->findChild<QPushButton *>("button1");

вроде он как раз отвечает на мою задачу, только в GUI среде, разве нет?

Ладно, допустим я брежу и что же? Множить if'ы?

Arxell
() автор топика
Ответ на: комментарий от const86

> std::find, std::find_if? 

class CControls: public QObject {
	Q_OBJECT

	public:
		QStringList	ToolBar;
		QStringList	Scroll;
		QStringList	Header;
		QStringList	Title;
		QStringList	Line;
		QStringList	Exec;
		QStringList	Filter;
		QStringList	Scales;
		QStringList	Curve;
		QStringList	Stylens;
		QStringList	Legend;
		QStringList	ColorColumn;
		QStringList 	ColumN;
		QStringList 	Grid;
		QStringList	Print;
		QStringList 	Access;
		QStringList 	Format;
	CControls(QObject* parent = 0);
};

с трудом представляю как это поможет в моём случае?
если мне надо получить член класса, а не элемент внутри члена класса.

Arxell
() автор топика
Ответ на: комментарий от Arxell

как то так :

Q_PROPERTY(QStringList ToolBar READ toolBar)
public:
QStringList toolBar() const { return ToolBar; } // no overhead(CoW)
...
...
...
QStringList l=this->property("ToolBar").toStringList()

kitov ★★★
()
Ответ на: комментарий от kitov

kitov

вариант рабочий, но ведь для того чтобы обыграть все мои свойства класса, надо написать для каждого строку Q_PROPERTY и метод типа твоего "QStringList toolBar() const { return ToolBar; } // no overhead(CoW)".

Есть ли в этом смысл если через if'ы получается немногим больше строк, а может и столько же?

Arxell
() автор топика
Ответ на: комментарий от Arxell

>Есть ли в этом смысл если через if'ы получается немногим больше строк, а может и столько же?

Смысл в этом есть как минимум в том, что вы не будете оставлять поля вашего класса открытыми и будете управлять доступом к ним (т.е. без вашего ведома никто не сможет ни записать, ни прочитать ничего из этих полей).

А без Q_PROPERTY в данном случае не обойдётесь, т.к. именно этот макрос дает метаинформацию и возможность получать свойство по его имени (сам по себе C++ рефлексию не поддерживает).

Sectoid ★★★★★
()
Ответ на: комментарий от Arxell

>Есть ли в этом смысл если через if'ы получается немногим больше строк, а может и столько же?

Я думаю есть :-) 

kitov ★★★
()
Ответ на: комментарий от Arxell

> QStringList ToolBar;
> QStringList Scroll;

> QStringList Header;


Мне почему-то кажется, что если хочется for, а не if, то это всё должно быть в одной структуре данных (например, предложенный выше map). Либо можно оставить отдельными полями, но сделать map с указателями.

const86 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.