如何从QString设置Q_ENUM

时间:2017-01-05 14:56:09

标签: c++ qt

我正在尝试从QString设置Q_ENUM,但我不知道如何做到这一点。有经验的人吗?

2 个答案:

答案 0 :(得分:4)

您需要从QMetaObject中获取匹配的QMetaEnum,用于声明Q_ENUM的基于QObject的类型。一旦有了,就可以获得字符串所代表的整数。对于带有名为EnumName的枚举的示例类MyEnumContainer,其具有名为SomeKeyInEnumName的条目,这可能类似于以下内容:

import tkinter as tk

# added only to define required global variable "txt"
class Txt(object):
    def SetValue(data): pass
    def GetValue(): pass
txt = Txt()
####

def load():
    with open(textField.get()) as file:
        txt.SetValue(file.read())

def save():
    with open(textField.get(), 'w') as file:
        file.write(txt.GetValue())

win = tk.Tk()
win.title('Text Editor')
win.geometry('500x500')

# create text field
textField = tk.Entry(win, width=50)
textField.pack(fill=tk.NONE, side=tk.TOP)

# create button to open file
openBtn = tk.Button(win, text='Open', command=load)
openBtn.pack(expand=tk.FALSE, fill=tk.X, side=tk.TOP)

# create button to save file
saveBtn = tk.Button(win, text='Save', command=save)
saveBtn.pack(expand=tk.FALSE, fill=tk.X, side=tk.TOP)

win.mainloop()

对于QMetaEnum中的其他有用技巧,https://doc.qt.io/qt-5/qmetaenum.html应该会给你一些想法。

答案 1 :(得分:0)

枚举示例(也适用于普通枚举):

enum class MyEnumType
{
   foo,
   bar
};
ENUM(MyEnumType);

我发现的最简单的方法是使用3条基本代码:

QString&& yourString = "foo";
auto&& metaEnum = QMetaEnum::fromType<MyEnumType>();
MyEnumType wantedEnum = static_cast<MyEnumType>(metaEnum.keyToValue(yourString)));

请注意,只有在字符串不为空时才使用keyToValue执行!yourString.isEmpty()。就我而言,枚举值最终在内存中为0xFF。我没有在代码段中包含此内容,因为此检查取决于您的实现。