Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Общие вопросы _ Как преобразовать перечисляемый тип в QString ?

Автор: Qt =( 7.3.2009, 23:45

Чтобы не плодить неинтересные темы напишу в этой.
Как преобразовать перечисляемый тип
typedef enum ..... {
......,
......,
......,
} .......;
в QString ???

Автор: BRE 7.3.2009, 23:49

Цитата(Qt =( @ 7.3.2009, 23:45) *
Чтобы не плодить неинтересные темы напишу в этой.
Как преобразовать перечисляемый тип
typedef enum ..... {
......,
......,
......,
} .......;
в QString ???

Ты хочешь получить имена из перечисления? Тогда никак.

Автор: Qt =( 8.3.2009, 0:11

Цитата(BRE @ 7.3.2009, 23:49) *
Цитата(Qt =( @ 7.3.2009, 23:45) *
Чтобы не плодить неинтересные темы напишу в этой.
Как преобразовать перечисляемый тип
typedef enum ..... {
......,
......,
......,
} .......;
в QString ???

Ты хочешь получить имена из перечисления? Тогда никак.

да ладно...в делфях и то есть фукция GetEnumName.

Автор: kwisp 8.3.2009, 2:24

Qt =(,
почему никак? сам пиши функцию а вообще на форуме уже есть тема на этот счет.
я пользую так называемый X solution.
http://www.forum.crossplatform.ru/index.php?showtopic=1963

ЗЫ.
может новый стандарт нам что нить интересное подкинет.

Автор: SABROG 8.3.2009, 11:46

Предлагаю не ждать стандартов, а воспользоваться мета-объектными средствами Qt.

#include <QtCore/QtGlobal>
#include <QtCore/QtDebug>
#include <QtCore/QMetaObject>
#include <QtCore/QMetaEnum>

class Programmer : public QObject
{
    Q_OBJECT
public:
    enum Language {ASM, C, CPP, PASCAL, FORTRAN, BASIC, JAVA};
    Q_ENUMS(Language)
};

int main(int argc, char *argv[])
{
    const QMetaObject &mo = Programmer::staticMetaObject;
    int index = mo.indexOfEnumerator("Language");
    QMetaEnum me = mo.enumerator(index);
    Programmer::Language p = Programmer::CPP;
    Programmer::Language l= static_cast<Programmer::Language>(me.keyToValue("CPP"));
    qDebug() << me.valueToKey(p) << ":" << l;
    return 0;
}

#include "main.moc"


CPP : 2


Не забудьте прописать CONFIG += console в .pro файле.

Автор: kwisp 8.3.2009, 12:05

SABROG,
спасибо я к примеру этого не знал.
однако,по моему, все все равно сводится к созданию массива(мли мэпа) и функции доступа к строкам(если пользоваться этим напрямую то можно использовать не только в программах на Qt).

если честно, громоздко выглядит. чтобы получить строку необходимо объект создать все же это вызов конструктора.
и вот эта строка еще.
int index = mo.indexOfEnumerator("Language");
доступ к индексу по строке.

Автор: SABROG 8.3.2009, 13:18

Согласен. Но код по сути - сырец. Можно его причесать так, чтобы было все чин-чинарем, с перегрузкой операторов и прочее.
Кроме того у этого кода есть преимущества над препроцессорными средствами. И к тому же он избавляет человека от двойного объявления членов списка. Раньше я обычно это решал таким образом:

//псевдокод

enum states {state1, state2};
const char *astates[] = {"state1", "state2"};
printf(astates[state1]);

Автор: Qt =( 11.3.2009, 19:57

2 SABROG
а если enum Language {ASM, C, CPP, PASCAL, FORTRAN, BASIC, JAVA} описан не в классе? то как тогда?

Автор: SABROG 12.3.2009, 12:22

Цитата(Qt =( @ 11.3.2009, 19:57) *
2 SABROG
а если enum Language {ASM, C, CPP, PASCAL, FORTRAN, BASIC, JAVA} описан не в классе? то как тогда?

Поместить в класс. Рефакторинг.

Автор: Qt =( 13.3.2009, 15:14

Цитата(SABROG @ 12.3.2009, 12:22) *
Цитата(Qt =( @ 11.3.2009, 19:57) *
2 SABROG
а если enum Language {ASM, C, CPP, PASCAL, FORTRAN, BASIC, JAVA} описан не в классе? то как тогда?

Поместить в класс. Рефакторинг.

Благодарю именно так и поступил =)

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)