C++11 如何正确比较Q_ENUM和QStringList

C++11 如何正确比较Q_ENUM和QStringList,c++11,qt5,qtablewidget,qstring,qenum,C++11,Qt5,Qtablewidget,Qstring,Qenum,我有一个小例子.ui,用户可以使用QGraphicsProxyWidget一个特定的小部件(在我的例子中是QTableWidget)从QListWidget拖放到QGraphicsView,如下所示 基本上我一直在寻找的行为是: 如果我拖放“Imgaes”,则QGraphicsView上的QTableWidget将有2列2行;(哪一个是正确的) 如果我拖放“路径”,则QGraphicsView上的QTableWidget将有3列和3行;(哪个是错的) [1] : 下面选择“路径”,它仍然给出2

我有一个小例子
.ui
,用户可以使用
QGraphicsProxyWidget
一个特定的小部件(在我的例子中是
QTableWidget
)从
QListWidget
拖放到
QGraphicsView
,如下所示

基本上我一直在寻找的行为是:

如果我拖放“Imgaes”,则
QGraphicsView
上的
QTableWidget
将有2列2行;(哪一个是正确的) 如果我拖放“路径”,则
QGraphicsView
上的
QTableWidget
将有3列和3行;(哪个是错的)

[1] :

下面选择“路径”,它仍然给出2行2列,而不是3行3列

[2] :

代码如下:

场景.h

class Scene : public QGraphicsScene {

    enum LaserTableWidget {
      Images,
      Path
    };
    Q_ENUM(LaserTableWidget)

public:
  Scene(QObject *parent = nullptr);

  void compare(const QString& comp);

  template<typename QEnum>
  std::string QtEnumToString (const QEnum value)
  {
    return std::string(QMetaEnum::fromType<QEnum>().valueToKey(value));
  }

protected:
  void dropEvent(QGraphicsSceneDragDropEvent *event);
也许我的模板函数是错误的选择?如果可能的话,我想找到一种使用它的方法

这就是我切换到
void比较(const QString&comp)的原因
函数并尝试将作业委托给一个
switch-case
语句,但这也没有像我预期的那样工作,我仍然看到相同的
QtableWidget
被放到
QGraphicsView

当然,我做了更多的研究,找到了源代码,最重要的是,这有助于理解基本的比较,在这篇文章之后,我决定继续尝试将
Q_ENUM-QString
甚至
QStringList
作为一个有价值的工具。但我不知道我做错了什么


谁能告诉我哪种方法更好?(或者它们都是正确的)并尝试解释我在解决此问题时遗漏了什么。

我在您的代码中看到了两个问题:

  • 传递给
    keyToValue()
    的参数错误。由于枚举中有
    Image
    Path
    ,因此要传递给
    keyToValue()
    的有效值为“Image”(返回0)和“Path”(返回1),其他值将返回-1

  • 在函数
    Scene::compare()
    中,
    tabs
    只是创建为空的
    QStringList
    ,因此(const QString&color:tabs)的循环
    中的代码永远不会执行

  • 下面是一个测试程序,向您展示我的意思:

    主窗口

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    #include <QMetaEnum>
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        MainWindow(QWidget *parent = nullptr);
        ~MainWindow();
    
        enum LaserTableWidget
        {
            Images,
            Path
        };
        Q_ENUM(LaserTableWidget)
    
        template<typename enum_type>
        QString QtEnumToString (const enum_type value)
        {
            return QMetaEnum::fromType<enum_type>().valueToKey(value);
        }
    };
    #endif // MAINWINDOW_H
    

    我认为给定的代码甚至不会产生错误的输出
    tabs
    只是一个空列表,那么对于
    tabs
    中的每个元素,都会显示一个表?我假设
    comp
    是“图像”或“路径”,为什么要使用
    toUpper()
    呢?您好@NgocminNguyen,谢谢您停下来阅读这个问题。是
    comp
    用于“图像”或“路径”。我遇到的问题是,我试图将其与使用
    模板
    函数结合起来。与
    QEnum
    QString
    相比,这是我练习使用
    template
    的一种方法,但是缺少了一些东西,无法找出可能是什么。你还没有回答我的问题,你是对的:)好的,所以:1)对
    选项卡中的每个元素显示一个表。2) 我使用了
    toUpper()
    ,使darg从
    QListWidget
    选项(例如“图像”、“路径”)下拉到
    QGraphicsView
    ,作为区分大小写的选项。因此,如果存在“图像”而不是“图像”,则
    元枚举
    应该抛出并出错,因此
    模板
    应该能够处理该问题。感谢您花时间回答我的问题。我现在明白了您使用
    Q_ENUM
    的意思以及如何正确使用它。非常感谢您的时间:)。如果你认为我的问题很清楚,请竖起大拇指:)
      template<typename QEnum>
      std::string QtEnumToString (const QEnum value)
      {
        return std::string(QMetaEnum::fromType<QEnum>().valueToKey(value));
      }
    
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    #include <QMetaEnum>
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        MainWindow(QWidget *parent = nullptr);
        ~MainWindow();
    
        enum LaserTableWidget
        {
            Images,
            Path
        };
        Q_ENUM(LaserTableWidget)
    
        template<typename enum_type>
        QString QtEnumToString (const enum_type value)
        {
            return QMetaEnum::fromType<enum_type>().valueToKey(value);
        }
    };
    #endif // MAINWINDOW_H
    
    #include "mainwindow.h"
    
    #include <QDebug>
    #include <QStringList>
    
    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
    {
        // First problem: wrong parameter passed to keyToValue()
    
        qDebug() << 1 << QtEnumToString<LaserTableWidget>(Images);
        qDebug() << 2 << QtEnumToString<LaserTableWidget>(Path);
    
        QMetaObject MetaObject = this->staticMetaObject;
        QMetaEnum MetaEnum = MetaObject.enumerator(MetaObject.indexOfEnumerator("LaserTableWidget"));
    
        qDebug() << 3 << MetaEnum.keyToValue(QtEnumToString<LaserTableWidget>(Path).toUpper().toLatin1());
        qDebug() << 4 << MetaEnum.keyToValue(QtEnumToString<LaserTableWidget>(Path).toStdString().c_str());
    
        switch (MetaEnum.keyToValue(QtEnumToString<LaserTableWidget>(Path).toUpper().toLatin1()))
        {
            case Images:
                qDebug() << "switch Images";
                break;
            case Path:
                qDebug() << "switch Path";
                break;
            default:
                qDebug() << "switch default";
                break;
        }
    
        // Second problem: tabs is empty
        QStringList tabs;
        for (const QString &color : tabs)
            qDebug() << color; // this line is never executed
    }
    
    MainWindow::~MainWindow()
    {
    }
    
    1 "Images"
    2 "Path"
    3 -1
    4 1
    switch default