2012-06-23 2 views
1

QLineEdit에서 파생 된 클래스를 만들고 싶지만 Escape 단추에 신호를 할당 할 수 없습니다.QLineEdit 및 Escape 신호

cancel_signal()을 추가하고 LNK2019/LNK1120 오류가 나타날 때까지 코드가 작동했습니다.

어떻게 탈출 버튼에 신호를 할당 할 수 있습니까?


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 : 신호가 C++ 함수이기 때문에

#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

사용자가 커서를 이동하고 백 스페이스 및 삭제 키를 사용하여 마지막 문자뿐만 아니라 모든 문자를 삭제할 수있게하려면 왼쪽, 오른쪽, 백 스페이스 및 삭제 키를 슈퍼 키로 전달해야합니다 class 이벤트 핸들러. – leemes

+0

"위젯의 링크 된 목록"(여기에있는 가정)이 순환 적이 지 않지만 양쪽 끝에 널 포인터가있는 경우 멤버 함수에 액세스하기 전에 포인터가 null인지 확인해야합니다 위/아래 키용). – leemes

답변

3

이 연결 오류를 가지고있는 정의되지 않았습니다. 이는 일반적으로 클래스의 일부 코드를 생성하지 않는 moc에 의해 수행됩니다.

당신이 QObject 파생 클래스에서 신호와 슬롯을 사용하거나 QMetaObject를 사용하는 다른 뭔가를 필요로 할 때마다

, 당신은 클래스 정의의 여는 중괄호 후

Q_OBJECT 

를 추가해야합니다. 이 매크로를 추가 할 때 QtCreator가 현명하게하려고하고 .pro 파일이 변경되지 않은 경우이 빌드 단계를 건너 뛰고 있기 때문에, 당신은 또한 수동으로 qmake를을 실행 에 필요

참고. 그러나 Q_OBJECT 매크로의 유무는 moc (메타 오브젝트 컴파일러)이 클래스 정의에서 Q_OBJECT 매크로를 갖는 모든 파일을 통해 실행되어야하므로 qmake에 대한 변경으로 간주되어야합니다.

+0

덕분에, 나는 정말로 그것을 버렸습니다. 당신은 큰 부담을 덜어 줬습니다. – amcali

+0

@amcali 문제 없음 :) 제가 제안하는 것은 : 프로그램을 컴파일하지 않을 때마다 확인 /해야 할 일들에 대한 체크리스트를 만드십시오. QObject 파생 클래스에'Q_OBJECT' 매크로를 삽입하고, 수동으로'qmake'를 다시 실행하고, 응용 프로그램을 완전히 다시 빌드하십시오. (언젠가는 컴파일러/링커 오류를 설명 할 수 없으며 일부 누락으로 인해 발생합니다 Makefile의 의존성 또는 기타 ...) – leemes