(Qt C++)暂时"disable" 2D 地图中的一个键?

(Qt C++) Temporarily "disable" one key in a 2d map?

本文关键字:一个 2D C++ Qt 暂时 disable 地图      更新时间:2023-10-16

我正在做一个有二维地图的项目:

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

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

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

我尽力解释这一点。如有任何帮助,我们将不胜感激:)

方法1

生成一个类,该类具有二维向量或二维映射的基础容器,但具有所需的所有访问器方法。

C++多维数组运算符

操作员[][]过载

然后,您可以在其中一个访问器方法的中间抛出一个if语句,并让它返回一个空值或默认值,而不是存储的值,如果您这样启用它的话。

方法2

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

struct MyPixmap
{
    bool enabled;
    QPixmap pixmap;
}

方法3

让映射的外层指向一个结构或类,该结构或类除了可以指向映射之外,还具有默认的参数系统。

希望能有所帮助。如果你需要更多信息或更好的例子,请告诉我。

编辑:下面是一些让方法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