我正在一个有2d map 的项目中:
QMap < int, QMap < int, QPixmap> > slot_pic;
我设置了一个表来初始化值:
slot_pic[0][0] = QPixmap("path...");
slot_pic[1][0] = QPixmap("path...");
slot_pic[2][0] = QPixmap("path...");
slot_pic[3][0] = QPixmap("path...");
...
有时,第二个键会像这样更改:
...
slot_pic[300][0] = QPixmap("path...");
slot_pic[300][1] = QPixmap("path...");
slot_pic[300][2] = QPixmap("path...");
slot_pic[300][3] = QPixmap("path...");
slot_pic[301][0] = QPixmap("path...");
...
在程序的某个时刻,我遇到了一个只想看第一个数字的键。像素图的路径则仅取决于第一个键。像这样:
...
slot_pic[357][0] = QPixmap("path...");
slot_pic[358] = QPixmap("path...");
slot_pic[359][0] = QPixmap("path...");
...
但是很明显,我收到语法错误。如果该键是我定义的数字,如何告诉我的程序仅查看第一个键? (358)我每次都可以这样写一千遍:
...
slot_pic[358][1] = QPixmap("path...");
slot_pic[358][2] = QPixmap("path...");
...
slot_pic[358][50] = QPixmap("path...");
slot_pic[358][55] = QPixmap("path...");
...
因此,基本上,如何使2D map 仅依赖于一个键?
注意:我不想更改第二个键的值,稍后在我的程序中需要它。我只想停止查看 map 中的某个键。
我试图尽我所能解释。任何帮助,将不胜感激 :)
最佳答案
方法1
使一个类具有2D vector 或2D map 的基础容器,但具有所需的所有访问器方法。
C++ multidimensional array operator
Operator[][] overload
然后,您可以在一个访问器方法的中间插入一个if语句,并使它返回空值或默认值,而不是存储的值(如果您以这种方式打开它的话)。
方法二
除了将pixmap存储在 map 中之外,还应存储一个结构,该结构除了具有pixmap之外,还具有诸如已打开或关闭的信息。
struct MyPixmap
{
bool enabled;
QPixmap pixmap;
}
方法3
将 map 的外层指向具有默认自变量系统的结构或类,以及指向 map 的功能。
希望能有所帮助。让我知道您是否需要更多信息或其中之一的更好示例。
编辑:这是一些使方法3起作用的代码。它使用模板。希望这是有道理的。您可能应该为MyMap实现一个复制构造函数,以及一个析构函数……但是如果没有它,它可能会起作用。
http://www.cplusplus.com/doc/tutorial/templates/
main.cpp
#include <QApplication>
#include "mymap.h"
#include <QString>
#include <QDebug>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QMap < int, MyMap < int, QString> > slot_pic;
slot_pic[0][0] = "0,0";
slot_pic[1][0] = "1,0";
slot_pic[2][0] = "2,0";
slot_pic[3][0] = "3,0";
slot_pic[300][0] = "300,0";
slot_pic[300][1] = "300,1";
slot_pic[300][2] = "300,2";
slot_pic[300][3] = "300,3";
slot_pic[301][0] = "301,0";
slot_pic[357][0] = "357,0";
slot_pic[358][0] = "358,0";
slot_pic[359][0] = "359,0";
// slot_pic[358].default_value() = slot_pic[0][0];
// slot_pic[357][1] = slot_pic[358].default_value();
qDebug() << slot_pic;
qDebug() << slot_pic[358].default_value();
qDebug() << slot_pic[300].default_value();
return a.exec();
}
mymap.h
#ifndef MYMAP_H
#define MYMAP_H
#include <QMap>
template <class Key, class T>
class MyMap : public QMap <Key, T>
{
public:
MyMap();
T & operator[] ( const Key & key );
T & default_value ();
private:
Key m_default_key;
};
// Since template classes are generated
// on demand by the compiler, the implementation should
// stay in this class.
template <typename Key, typename T>
MyMap <Key, T>::MyMap(): QMap<Key, T>()
{
}
template <class Key, class T>
T & MyMap <Key, T>::operator[] ( const Key & key )
{
// Store the key and use it as a default
m_default_key = key;
return QMap::operator [](key);
}
template <class Key, class T>
T & MyMap <Key, T>::default_value ()
{
return QMap::operator [](m_default_key);
}
#endif // MYMAP_H
关于c++ - (Qt C++)暂时 “disable” 2d map 中的一个键吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17645075/