2

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

4

2 回答 2

3

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

class MyTableWidget : public QTableWidget
{
...
public:
  virtual void keyboardSearch(const QString& search) {};
...
};
于 2012-12-21T02:51:42.233 回答
1

公认的解决方案存在问题,即 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() );
    }

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

于 2020-08-27T11:13:32.613 回答