【问题标题】:QLineEdit and Escape SignalQLineEdit 和转义信号
【发布时间】:2012-06-23 13:57:54
【问题描述】:

我想创建一个派生自 QLineEdit 的类,但我无法为 Escape 按钮分配信号。

在我添加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;
}

【问题讨论】:

  • 请注意,如果您希望用户能够移动光标并使用退格键和删除键删除任何字符(不仅是最后一个),您应该前进左、右、退格和删除超类事件处理程序的键。
  • 另请注意,如果您的“小部件链接列表”(我想您在这里)不是循环的,但两端都有空指针,您应该在访问之前检查指针是否为空成员函数(在您的情况下用于向上/向下键)。

标签: qt signals qlineedit


【解决方案1】:

您收到此链接错误,因为信号是一个尚未定义的 C++ 函数。这通常由moc 完成,它不会生成您的类的某些代码。

当你想在QObject派生类中使用信号和槽或者需要使用QMetaObject的其他东西时,你需要添加

Q_OBJECT

在你的类定义的左大括号之后。

请注意,当您添加此宏时,您还需要手动运行 qmake,因为如果 .pro 文件未更改,QtCreator 会尝试智能并跳过此构建步骤。但是 Q_OBJECT 宏的预先或缺失必须被视为对 qmake 的更改,因为 moc(元对象编译器)需要运行在类定义中具有 Q_OBJECT 宏的所有文件。

【讨论】:

  • @amcali 没问题 :) 我的建议是:为自己制定一份清单,列出程序无法编译时应检查/执行的事项。此列表可能包含:在 QObject 派生类中插入 Q_OBJECT 宏,手动重新运行 qmake,完全重建您的应用程序,...(有时无法解释一些编译器/链接器错误,它们是由一些缺失引起的Makefile 中的依赖项或其他任何内容...)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-20
  • 1970-01-01
  • 2015-01-03
  • 2019-10-01
  • 2013-09-15
相关资源
最近更新 更多