1

我正在开发一个具有 2d 地图的项目:

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...");
...

所以基本上,我怎样才能制作一个只依赖一个键的二维地图?

注意:我不想更改第二个键的值,稍后在我的程序中需要它。我只想停止查看地图中的某个键。

我试图尽可能地解释这一点。任何帮助,将不胜感激 :)

4

1 回答 1

2

方法一

创建一个具有 2D 矢量或 2D 地图的基础容器的类,但具有所需的所有访问器方法。

C++ 多维数组运算符

运算符[][] 重载

然后,如果您以这种方式打开它,您可以在其中一个访问器方法的中间添加一个 if 语句,并让它返回一个空值或默认值,而不是存储的值。

方法二

除了像素图之外,不要在地图中存储像素图,而是存储一个结构,该结构具有诸如打开或关闭之类的信息。

struct MyPixmap
{
    bool enabled;
    QPixmap pixmap;
}

方法三

除了指向地图的能力之外,让地图的外层指向具有默认参数系统的结构或类。

希望有帮助。如果您需要更多信息或其中之一的更好示例,请告诉我。

编辑:这是使方法 3 起作用的一些代码。它使用模板。希望这是有道理的。您可能应该为 MyMap 实现一个复制构造函数和一个析构函数......但没有它它可能会工作。

http://www.cplusplus.com/doc/tutorial/templates/

主文件

#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();
}

我的地图.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
于 2013-07-15T03:15:40.160 回答