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;
}
사용자가 커서를 이동하고 백 스페이스 및 삭제 키를 사용하여 마지막 문자뿐만 아니라 모든 문자를 삭제할 수있게하려면 왼쪽, 오른쪽, 백 스페이스 및 삭제 키를 슈퍼 키로 전달해야합니다 class 이벤트 핸들러. – leemes
"위젯의 링크 된 목록"(여기에있는 가정)이 순환 적이 지 않지만 양쪽 끝에 널 포인터가있는 경우 멤버 함수에 액세스하기 전에 포인터가 null인지 확인해야합니다 위/아래 키용). – leemes