Ich schreibe eine Anwendung, die auf einem Bildschirm verwendet wird, der über einige benutzerdefinierte Hardware-Schaltflächen verfügt (die Funktionstastenkombinationen zugeordnet sind). Jede Schaltfläche wird verwendet, um den angezeigten Bildschirm zu ändern. Daher dachte ich, dass ein gestapeltes Widget sinnvoll erscheint.Tastaturereignisse QMainWindow in QMainWindow
Um zu entwickeln Ich habe ein Debug-Fenster erstellt, das diese Schaltflächen als QPushButtons hat, mit dem "normalen" Hauptfenster eingebettet. Bei der Ausführung in Release-Build wollte ich dies als Hauptfenster ausführen
Dies funktioniert alles gut, aber Tasten drücken Ereignisse werden nicht wie erwartet verbreitet. Wenn ich die Qt-Dokumentation lese, würde dies bedeuten, dass das Widget mit dem Fokus die Ereignisse erhalten würde. Ich hatte also angenommen, dass das im gestapelten Widget angezeigte Widget den Tastendruck erhält, aber das Debug-Fenster immer die Schlüsselereignisse erhält, unabhängig von der Fokus-Richtlinie
Debug-Fenster:
DebugWindow::DebugWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::GVADemo)
{
ui->setupUi(this);
MainWindow* main = new MainWindow(this);
QLayout* layout = new QHBoxLayout;
layout->addWidget(main);
layout->setContentsMargins(0,0,0,0);
ui->frame->setLayout(layout);
}
void GVADemo::keyPressEvent(QKeyEvent *event)
{
qDebug("GVADemo keyPressEvent %d", event->key());
}
Hauptfenster:
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
Screen* screen1 = new Screen();
QStackedWidget* stackedWidget = new QStackedWidget(this);
stackedWidget->addWidget(screen1);
stackedWidget->setCurrentWidget(screen1);
setCentralWidget(stackedWidget);
}
void MainWindow::keyPressEvent(QKeyEvent *event)
{
qDebug("MainWindow keyPressEvent %d", event->key());
}
Beispiel-Bildschirm für gestapelte widget:
Screen::Screen(QWidget *parent) : QWidget(parent), ui(new Ui::Screen)
{
ui->setupUi(this);
}
void SAScreen::keyPressEvent(QKeyEvent *event)
{
qDebug("Screen keyPressEvent %d", event->key());
}
Ich erinnere mich, dass Sie Ereignisfilter installieren können, die ausgelöst werden, bevor ein Ereignis "geliefert" wird. (Ich habe es nicht selbst gemacht - daher kann ich nur diesen groben Hinweis geben ...) – Scheff
Bitte werfen Sie einen Blick auf Qt doc. [Ereignisfilter] (http://doc.qt.io/qt-5/eventsandfilters.html#event-filters). Das sieht vielversprechend aus. Es gibt sogar einen kleinen Beispielcode für 'QEvent :: KeyPress' ... – Scheff
Eine andere Option können Verknüpfungen sein (jenseits der Qt-Welt auch" Accelerator Keys "genannt) ... [SO: Tastenkombinationen zu Tasten zuweisen - Qt C++ ] (https://stackoverflow.com/q/4629629/7478597), [SO: So programmieren Sie benutzerdefinierte Tastaturkürzel] (https://stackoverflow.com/questions/17631601/how-to-program-custom-keyboard- Verknüpfungen). (Seltsam, dass das nicht meine erste Idee war ...) – Scheff