Ошибка Qt5: «ColorKeyMap» не называет тип - PullRequest
0 голосов
/ 25 февраля 2019

Я пишу класс, который имеет следующую структуру:

Заголовочный файл:

#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 Ответ

0 голосов
/ 25 февраля 2019

В вашем коде произошла пара ошибок.

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

Кроме этого код компилируется безпроблема.

...