Ошибка Qt5: "ColorKeyMap" не называет тип
Я пишу класс, который имеет следующую структуру:
Заголовочный файл:
#pragma once
#include <QtCore>
#include <QtGui>
#include <QtWidgets>
class VirtualButton : public QWidget {
Q_OBJECT
public:
VirtualButton( QWidget *parent );
private:
static QMap<unsigned int, QColor> ColorKeyMap;
static QList<unsigned int> goodKeys;
};
CppFile
#include "VirtualButton.hpp"
QMap<unsigned int, QColor> VirtualButton::ColorKeyMap = QMap<unsigned int, QColor>();
ColorKeyMap[ 23 ] = QColor( 0xff, 0x00, 0xff );
QList<unsigned int> VirtualButton::goodKeys = QList<unsigned int>() << 50 << 62 << 37 << 133 << 64 << 108 << 135 << 109;
VirtualButton::VirtualButton( QWidget *parent ) : QWidget( parent ) {
setFixedSize( 48, 48 );
};
int main( int argv, char **argv ) {
QApplication app( argc, argv );
VirtualButton *btn = new VirtualButton();
btn->show();
return app.exec()
}
Когда я компилирую этот код, я получаю следующую ошибку:
VirtualKeyboard.cpp:4:1: error: ‘ColorKeyMap’ does not name a type; did you mean ‘QColormap’?
ColorKeyMap[ 23 ] = QColor( 0xff, 0x00, 0xff );
^~~~~~~~~~~
QColormap
Почему появляется эта ошибка? Я вижу, что у goodKeys нет проблем, а у ColorKeyMap есть. Это потому, что QColor не должен использоваться вне класса?
1 ответ
В вашем коде было несколько ошибок.
Основная проблема заключается в том, что вы хотите изменить для определенного ключа *, а именно
23
значение цвета, а именноQColor( 0xff, 0x00, 0xff );
Проблема в том, что, хотя вы можете инициализировать закрытый статический член за пределами вашего класса, как вы это сделали, вы не сможете изменить его позже. Вы даже не можете прочитать это позже вне класса. Вы можете получить к нему доступ только в будущем через функцию-член класса
VirtualButton
,
К счастью, есть работа вокруг. Вы можете использовать статическую функцию (а именно initColorKeyMap()
) чтобы инициализировать ваш статический член ColorKeyMap
, как показано в коде ниже.
virtualbutton.h
#pragma once
#include <QtWidgets/QtWidgets>
#include <QMap>
#include <QList>
class VirtualButton : public QWidget {
Q_OBJECT
public:
VirtualButton( QWidget *parent );
private:
static QMap<unsigned int, QColor> initColorKeyMap();
static QMap<unsigned int, QColor> ColorKeyMap;
static QList<unsigned int> goodKeys;
};
virtualbutton.cpp
#include "virtualbutton.h"
QMap<unsigned int, QColor> VirtualButton::initColorKeyMap() {
QMap<unsigned int, QColor> temp = QMap<unsigned int, QColor>();
temp[ 23 ] = QColor( 0xff, 0x00, 0xff );
return temp;
}
QMap<unsigned int, QColor> VirtualButton::ColorKeyMap = VirtualButton::initColorKeyMap();
QList<unsigned int> VirtualButton::goodKeys = QList<unsigned int>() << 50 << 62 << 37 << 133 << 64 << 108 << 135 << 109;
VirtualButton::VirtualButton( QWidget *parent ) : QWidget( parent ) {
setFixedSize( 48, 48 );
}
- Было несколько ошибок / ошибок в вашем
main()
Кроме того, но я думаю, что это были просто побочные проблемы, а не ваша главная проблема. В любом случае, вот main.cpp также с небольшими исправлениями и дополнительным кодом. (С добавленным кодом я хотел протестировать ваш класс Button, пока не понял, что он не является производным от QPushButton, и поэтому я не могу показать VirtualButton на виджете. Просто понял это позже. В любом случае, он не имел никакого отношения к реальная проблема под рукой. Код компилируется с правильно инициализированнымColorKeyMap
)
main.cpp
#include "virtualbutton.h"
#include <QtCore>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QWidget window;
window.resize(320, 240);
window.setWindowTitle(QApplication::translate("childwidget", "Child widget"));
window.show();
// QPushButton *button = new QPushButton(
// QApplication::translate("childwidget", "Press me"), &window);
VirtualButton *button = new VirtualButton(&window);
// button->move(100, 100);
button->show();
return app.exec();
}
Кроме этого код компилируется без проблем.