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