QLineEdit的和逃逸信号

问题描述 投票:1回答:1

我想创建是从QLineEdit派生的类,但我不能指定为退出键的信号。

该代码是工作,直到我加入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:

#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;
}
qt signals qlineedit
1个回答
3
投票

因为信号是一个C ++函数,尚未确定你有这个链接错误。这通常是由moc,它不产生类的一些代码来完成。

当你想使用信号和槽在QObject派生类或需要别的东西,它使用QMetaObject,你需要添加

Q_OBJECT

后您的类定义的左大括号。

请注意,当您添加该宏,你还需要手动QMAKE运行,因为QtCreator试图聪明,如果.pro文件并没有改变跳过此构建步骤。但Q_OBJECT宏的预与否,必须考虑为QMAKE的变化,因为moc(元对象编译器)需要运行在具有类定义一个宏Q_OBJECT所有文件。

© www.soinside.com 2019 - 2024. All rights reserved.