如何禁用QTableWidget中的箭头键导航



目前,我正在为类似DnD的游戏编写一个战斗管理器。战斗中活跃的角色显示在表格中。对于这张表,我使用的是QTableWidget
现在我实现了一个功能,允许用户使用Enter-Key浏览此表。如果用户到达表的末尾并再次点击Enter,则下一个高亮显示的行是第一行,因此下一轮开始
除了Enter-键之外,当前还可以使用Arrow-键(UpDown(导航行。但我不想要这个。导航应该只能使用Enter-键
因此,我的问题是:如何禁用QTableWidget中的Arrow-密钥?到目前为止,我尝试过的是:

  1. 实现一个keyPressEvent-函数,该函数还处理Enter-键。如果按下其中一个Arrow键,则此功能应返回,但使用这些键进行导航(意味着选择行(仍然是可能的。代码在这里:
void TableWidget::keyPressEvent(QKeyEvent *event) {
// ...
// Code for the other keys
// ...
if(event->key() == Qt::Key_Down || event->key() == Qt::Key_Up) {
return;
}
}

如果我使用以下代码添加ignore-函数,情况也是如此:

if(event->key() == Qt::Key_Down || event->key() == Qt::Key_Up) {
event->ignore();
return;
}
  1. 我尝试实现一个eventFilter函数(示例在这里(。在这种情况下,如果按下UpDown-键,此函数将返回false,但仍然可以导航行

现在,我没有选择。是否可以在QTableWidget中禁用这些密钥?还是我错过了什么?使用QTableWidget是最好的主意吗?谢谢你的回答!

编辑2:现在我已经使用QTableWidget的一个子类进行了尝试。这个类的代码如下:

MyTableWidget.h

#include <QtWidgets>
class MyTableWidget : public QTableWidget {
Q_OBJECT
public:
MyTableWidget(QWidget *parent = nullptr);
~MyTableWidget();
private:
void setupTable();
void keyPressEvent(QKeyEvent *event);
QTableWidget *tableWidget;
};

MyTableWidget.cpp

#include "MyTableWidget.h"
MyTableWidget::MyTableWidget(QWidget *parent)
{
setupTable();
}
void MyTableWidget::setupTable() {
// Allocate widget and create a column
tableWidget = new QTableWidget(this);
tableWidget->setColumnCount(1);
// Create some rows
tableWidget->insertRow( tableWidget->rowCount() );
tableWidget->insertRow( tableWidget->rowCount() );
}
// This function calls some functions for certain keys
void MyTableWidget::keyPressEvent(QKeyEvent *event) {
if(event->key() == Qt::Key_Down || event->key() == Qt::Key_Up) {
event->ignore();
return;
}
}
MyTableWidget::~MyTableWidget()
{
}

修改后的mainwindow.h现在只具有具有以下代码的构造函数:

myTableWidget = new MyTableWidget(this);
setCentralWidget(myTableWidget);

第1版:将提供一个最低限度的示例。这将创建一个包含1列和2行的小表。

main.cpp:

#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}

主窗口.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QtWidgets>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
void setupTable();
void keyPressEvent(QKeyEvent *event);
QTableWidget *tableWidget;
};
#endif // MAINWINDOW_H

主窗口.cpp

#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
setupTable();
}
void MainWindow::setupTable() {
// Allocate widget and create a column
tableWidget = new QTableWidget();
tableWidget->setColumnCount(1);
// Set this widget to central
setCentralWidget(tableWidget);
// Create some rows
tableWidget->insertRow( tableWidget->rowCount() );
tableWidget->insertRow( tableWidget->rowCount() );
}
void MainWindow::keyPressEvent(QKeyEvent *event) {
if(event->key() == Qt::Key_Down || event->key() == Qt::Key_Up) {
event->ignore();
return;
}
}
MainWindow::~MainWindow()
{
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.5)
project(TablTest LANGUAGES CXX)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(QT NAMES Qt6 Qt5 COMPONENTS Widgets REQUIRED)
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Widgets REQUIRED)
add_executable(TableTest
main.cpp
mainwindow.cpp
mainwindow.h
)
target_link_libraries(TableTest PRIVATE Qt${QT_VERSION_MAJOR}::Widgets)

原因

您正在重新实现QMainWindowkeyPressEvent,而不是QTableWidget:

void MainWindow::keyPressEvent(QKeyEvent *event) {
if(event->key() == Qt::Key_Down || event->key() == Qt::Key_Up) {
event->ignore();
return;
}
}

解决方案

  1. 子类QTableWidget,例如MyTableWidget
  2. 在子类MyTableWidget中,重新实现QTableWidget::keyPressEvent
  3. 创建子类的对象MyTableWidget,即tableWidget = new MyTableWidget();,而不是tableWidget = new QTableWidget();

示例

以下是我为您编写的一个示例,用于演示如何实现所提出的解决方案:

MyTableWidget.h

#include <QTableWidget>
class MyTableWidget : public QTableWidget {
Q_OBJECT
public:
MyTableWidget(QWidget *parent = nullptr);
protected:
void keyPressEvent(QKeyEvent *event) override;
};

MyTableWidget.cpp

MyTableWidget::MyTableWidget(QWidget *parent)
{
}
void MyTableWidget::keyPressEvent(QKeyEvent *event) {
if (event->key() == Qt::Key_Down
|| event->key() == Qt::Key_Up) {
event->ignore();
return;
} else {
QTableWidget::keyPressEvent(event);
}
}

主窗口.cpp

#include "MyTableWidget.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
setupTable();
}
void MainWindow::setupTable() {
tableWidget = new MyTableWidget();
tableWidget->setColumnCount(1);
setCentralWidget(tableWidget);
// Create some rows
tableWidget->insertRow( tableWidget->rowCount() );
tableWidget->insertRow( tableWidget->rowCount() );
}

相关内容

  • 没有找到相关文章

最新更新