目前,我正在为类似DnD的游戏编写一个战斗管理器。战斗中活跃的角色显示在表格中。对于这张表,我使用的是QTableWidget
现在我实现了一个功能,允许用户使用Enter
-Key浏览此表。如果用户到达表的末尾并再次点击Enter
,则下一个高亮显示的行是第一行,因此下一轮开始
除了Enter
-键之外,当前还可以使用Arrow
-键(Up
和Down
(导航行。但我不想要这个。导航应该只能使用Enter
-键
因此,我的问题是:如何禁用QTableWidget
中的Arrow
-密钥?到目前为止,我尝试过的是:
- 实现一个
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;
}
- 我尝试实现一个
eventFilter
函数(示例在这里(。在这种情况下,如果按下Up
或Down
-键,此函数将返回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)
原因
您正在重新实现QMainWindow
的keyPressEvent
,而不是QTableWidget
:
void MainWindow::keyPressEvent(QKeyEvent *event) {
if(event->key() == Qt::Key_Down || event->key() == Qt::Key_Up) {
event->ignore();
return;
}
}
解决方案
- 子类
QTableWidget
,例如MyTableWidget
- 在子类
MyTableWidget
中,重新实现QTableWidget::keyPressEvent
- 创建子类的对象
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() );
}