【发布时间】:2017-08-14 12:11:53
【问题描述】:
我正在编写一个将在具有一些硬件自定义按钮(映射到功能键组合)的屏幕上使用的应用程序。每个按钮都用来改变显示的屏幕,所以我认为堆叠的小部件似乎是合理的。
为了开发,我创建了一个调试窗口,其中包含这些按钮作为 QPushButtons,并嵌入了“普通”主窗口。在发布版本中运行时,我打算将其作为主窗口运行
这一切都很好,但是按键事件没有像我预期的那样传播。阅读 Qt 文档,它表明具有焦点的小部件将接收事件,因此我假设堆叠小部件中显示的小部件将接收按键但调试窗口始终接收按键事件,无论我设置任何焦点策略
调试窗口:
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());
}
主窗口:
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());
}
堆叠小部件中的屏幕示例:
Screen::Screen(QWidget *parent) : QWidget(parent), ui(new Ui::Screen)
{
ui->setupUi(this);
}
void SAScreen::keyPressEvent(QKeyEvent *event)
{
qDebug("Screen keyPressEvent %d", event->key());
}
【问题讨论】:
-
我记得您可以安装事件过滤器,这些过滤器会在事件“传递”之前触发。 (我自己没有做——因此我只能提供这个粗略的提示......)
-
请看一下 Qt 文档。 Event Filters。这看起来很有希望。甚至还有一小段
QEvent::KeyPress的示例代码... -
另一个选项可能是快捷方式(在 Qt 世界之外也称为“加速键”)...SO: Assign shortcut keys to buttons - Qt C++、SO: How to Program custom Keyboard Shortcuts。 (奇怪,这不是我的第一个想法……)
标签: qt