在QTableWidget中禁用键盘搜索

时间:2012-12-20 17:36:53

标签: qt qtablewidget

我正在使用QTableWidget,我只用文字填充它。如果我选择一个单元格并按一个键,则选择将更改为以按下的键作为其起始字母的单元格。如何禁用此行为?

2 个答案:

答案 0 :(得分:3)

您需要定义自己的继承QTableWidget类的TableWidget类,并使用空实现覆盖虚拟keyboardSearch()函数。这将禁用键盘搜索功能。

class MyTableWidget : public QTableWidget
{
...
public:
  virtual void keyboardSearch(const QString& search) {};
...
};

答案 1 :(得分:0)

已接受的解决方案具有QAbstractItemView派生类型(QTableWidget)仍将接受并因此窃取各种键事件的问题。例如,如果您想在按下q键时关闭父窗口小部件,则不会收到q键按下事件。

查看QAbstractItemView::keyPressEvent的源代码,仅当事件文本为非空时才触发键盘搜索。因此,我发现覆盖keyPressEvent,在事件中清除此文本,然后调用基类实现是一个更好的解决方案:

class MyTable :
    public QTableView
{
public:
    void
    keyPressEvent( QKeyEvent* event ) override
    {
        /* Clear text in order to avoid keyboardSearch being triggered */
        QKeyEvent textClearedEvent( event->type(),
                                    event->key(),
                                    event->modifiers(),
                                    event->nativeScanCode(),
                                    event->nativeVirtualKey(),
                                    event->nativeModifiers(),
                                    QString(),
                                    event->isAutoRepeat(),
                                    event->count() );

        QTableView::keyPressEvent( &textClearedEvent );

        event->setAccepted( textClearedEvent.isAccepted() );
    }

这甚至可以在不继承的情况下通过安装类似的事件过滤器来实现。