Obecnie piszę menedżera bojowego dla gier podobnych do DND. Znaki aktywne w walce są wyświetlane w tabeli. W tej tabeli używam QTableWidget.
.. Teraz wdrożyłem cechę umożliwiającą użytkownikowi nawigowanie przez tę tabelę za pomocą klawisza Enter. Jeśli użytkownik dostanie się na końcu tabeli i ponownie uderza Enter, następny podświetlony wiersz jest pierwszym, więc rozpocznie się następna runda.
.. Oprócz Enter - klawisz, nawigując z rzędu za pomocą klawisza Arrow (Up i Down) jest obecnie. Ale nie chcę tego. Nawigacja powinna być możliwa przy użyciu tylko Enter -
Dlatego moje pytanie brzmi: jak mogę wyłączyć Arrow - klucze wewnątrz QTableWidget? Tak daleko, co próbowałem:

  1. Wdrażanie funkcji keyPressEvent - funkcja, która obsługuje również klawisz Enter. Ta funkcja powinna powrócić, jeśli naciśnięta jest jedna z klawiszy Arrow, ale nawigacja (co oznacza wybór wierszy) w tych klawiszach, jest nadal możliwe. Kod jest tutaj:
void TableWidget::keyPressEvent(QKeyEvent *event) {
     // ...
     // Code for the other keys
     // ...
     if(event->key() == Qt::Key_Down || event->key() == Qt::Key_Up) {
          return;
     }
}

Ma to również w przypadku, gdy dodam ignore - funkcja przy użyciu następującego kodu:

if(event->key() == Qt::Key_Down || event->key() == Qt::Key_Up) {
     event->ignore();
     return;
}
  1. Próbowałem zaimplementować funkcję eventFilter (przykład to Oto) . W tym przypadku, ta funkcja zwraca false Jeśli naciśnięta jest klawisz Up lub Down, ale nawigacja w wierszach jest nadal możliwa.

W tej chwili nie jestem poza opcjami. Czy nawet możliwe jest wyłączenie tych kluczy wewnątrz {x0}}? Czy coś przegapiłem? Czy użycie QTableWidget nawet najlepszego pomysłu? Dzięki za wszelkie odpowiedzi!

Edytuj 2: Teraz próbowałem go za pomocą podklasu QTableWidget. Kod tej klasy jest następujący:

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()
{
}

Zmodyfikowany mainwindow.h teraz ma konstruktor z następującym kodem:

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

Edytuj 1: zostanie zapewniony minimalny przykład. Spowoduje to utworzenie małej tabeli z 1 kolumną i 2 rzędami.

Main.cpp:

#include "mainwindow.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

Mainwindow.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

Mainwindow.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)
-1
Bakefish 4 październik 2020, 15:45

1 odpowiedź

Najlepsza odpowiedź

Przyczyna

Reimlumenting keyPressEvent QMainWindow, a nie QTableWidget:

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

Rozwiązanie

  1. Podklasa QTableWidget, np. MyTableWidget
  2. W podklasie MyTableWidget reimplement QTableWidget::keyPressEvent
  3. Zamiast tableWidget = new QTableWidget(); utwórz obiekt podklasy, {x1}}, I.E {x2}}

Przykład

Oto przykładem, który napisałem, aby zademonstrować, w jaki sposób można było wdrożyć proponowane rozwiązanie:

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);
    }
}

mainwindow.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() );
}
1
scopchanov 6 październik 2020, 07:17