2012-06-23 2 views
1

Я хочу создать класс, который получен из QLineEdit, но я не могу назначить сигнал для кнопки Escape.QLineEdit и Escape Signal

Код работал до тех пор, пока я не добавлю cancel_signal(), и появятся ошибки LNK2019/LNK1120.

Как я могу назначить сигнал для кнопки Escape?


LineEditAlphaNum.h:

#ifndef _LINEEDIT_ALPHA_NUM_ 
#define _LINEEDIT_ALPHA_NUM_ 

#include <QtGui> 

class LineEditAlphaNum : public QLineEdit 
{ 
public: 
    LineEditAlphaNum(QWidget* parent); 

    void setPrevNextWidget(QWidget* prev, QWidget* next); 

protected: 
    void keyPressEvent(QKeyEvent *); 

private: 
    void keyLogic(QString& str, int key); 

    int keyIndex; 
    int lastKey; 

    QWidget* m_pPrev; 
    QWidget* m_pNext; 

signals: 
    void cancel_signal(); 
}; 

#endif // _LINEEDIT_ALPHA_NUM_ 

LineEditAlphaNum.cpp:

#include "LineEditAlphaNum.h" 

LineEditAlphaNum::LineEditAlphaNum(QWidget *parent) : 
    QLineEdit(parent), 
    keyIndex(0), 
    lastKey(0) 
{ 
} 

void LineEditAlphaNum::keyPressEvent(QKeyEvent *e) 
{ 
    QString str = text(); 

    switch(e->key()) 
    { 
    case Qt::Key_Escape: 
     emit cancel_signal(); 
    case Qt::Key_Up: 
     m_pPrev->setFocus(Qt::OtherFocusReason); 
     break; 
    case Qt::Key_Down: 
     m_pNext->setFocus(Qt::OtherFocusReason); 
     break; 
    case Qt::Key_Right: 
     keyIndex = 0; 
     lastKey = e->key(); 
     break; 
    case Qt::Key_0: 
    case Qt::Key_1: 
    case Qt::Key_2: 
    case Qt::Key_3: 
    case Qt::Key_4: 
    case Qt::Key_5: 
    case Qt::Key_6: 
    case Qt::Key_7: 
    case Qt::Key_8: 
    case Qt::Key_9: 
     keyLogic(str, e->key()); 
     break; 
    case Qt::Key_Backspace: 
     str.remove(str.size()-1, 1); 
     break; 

    default: 
     break; 
    } 

    setText(str); 
} 

void LineEditAlphaNum::keyLogic(QString& str, int key) 
{ 
    char* Keys[] = {"0 ", 
        "1", 
        "2ABC", 
        "3DEF", 
        "4GHI", 
        "5JKL", 
        "6MNO", 
        "7PQRS", 
        "8TUV", 
        "9WXYZ"}; 

    char* keymap = Keys[ key - Qt::Key_0 ]; 
    int length = strlen(keymap); 

    if (lastKey == key) 
    { 
     keyIndex = (++keyIndex) % length; 
     str.remove(str.size()-1, 1); 
    } 
    else 
    { 
     keyIndex = 0; 
     lastKey = key; 
    } 

    str.append(QChar(keymap[keyIndex])); 
} 
void LineEditAlphaNum::setPrevNextWidget(QWidget* prev, QWidget* next) 
{ 
    m_pPrev = prev; 
    m_pNext = next; 
} 
+0

Обратите внимание, что если вы хотите, чтобы пользователь мог перемещать курсор и удалять любой символ (не только последний) с помощью клавиши backspace и delete, вы должны переслать левый, правый, обратный пробел и удалить ключ в супер класс. – leemes

+0

Также обратите внимание, что если ваш «связанный список виджетов» (как я полагаю, вы здесь) не является циклическим, но у вас есть указатели на нуль на обоих концах, вы должны проверить указатель на то, что он равен нулю до доступа к функции-члену (в ваших случаях для кнопок вверх/вниз). – leemes

ответ

3

Вы получили эту ошибку тяг, потому что сигнал является функцией C++, который не было определено. Обычно это делается с помощью moc, который не генерирует код вашего класса.

Всякий раз, когда вы хотите использовать сигналы и слоты в QObject производных классах или нужно что-то другое, которое использует QMetaObject, вам нужно добавить

Q_OBJECT 

после открытия фигурных скобок вашего определения класса.

Обратите внимание, что при добавлении этого макроса, вам также необходимо вручную запустить QMAKE, так как QtCreator пытается быть умным и пропускает этот шаг сборки, если файл .pro не изменился. Но предварительный или отсутствие макроса Q_OBJECT следует рассматривать как изменение для qmake, так как moc (компилятор метаобъекта) должен работать над всеми файлами с макросом Q_OBJECT в определении класса.

+0

спасибо, я действительно оставил это, вы спасли мне огромную ношу – amcali

+0

@amcali Нет проблем :) Что я предлагаю: сделайте себе контрольный список вещей, которые вы должны проверять/делать всякий раз, когда ваша программа не компилируется. Этот список может содержать: Вставить макрос 'Q_OBJECT' в производные классы QObject, вручную перезапустить' qmake', полностью перестроить ваше приложение ... (Иногда невозможно объяснить некоторые ошибки компилятора/компоновщика, и они вызваны некоторыми отсутствующими зависимостей в Makefile или что-то еще ...) – leemes

Смежные вопросы