使用快捷鍵可以達到預期的效果(實際上很簡單)。
我製備類似於在問題被描述的MCVE:
:
// Qt header:
#include <QtWidgets>
int main(int argc, char **argv)
{
qDebug() << "Qt Version: " << QT_VERSION_STR;
// main application
#undef qApp // undef macro qApp out of the way
QApplication qApp(argc, argv);
// setup GUI
QWidget qWin;
QGridLayout qGrid;
enum { N = 5 };
QStackedLayout qStack;
struct Pane {
QWidget qWidget;
QVBoxLayout qVBox;
QLabel qLbl;
QLineEdit qTxt;
} panes[N];
for (int i = 0; i < N; ++i) {
Pane &pane = panes[i];
pane.qLbl.setText(QString::fromUtf8("<b>Pane %0</b>").arg(i + 1));
pane.qLbl.setTextFormat(Qt::RichText);
pane.qVBox.addWidget(&pane.qLbl, 1, Qt::AlignCenter);
pane.qVBox.addWidget(&pane.qTxt);
pane.qWidget.setLayout(&pane.qVBox);
qStack.addWidget(&pane.qWidget);
}
qGrid.addLayout(&qStack, 0, 0, 1, N);
qGrid.setRowStretch(0, 1);
QPushButton qBtns[N];
for (int i = 0; i < N; ++i) {
QPushButton &qBtn = qBtns[i];
qBtn.setText(QString::fromUtf8("F%0").arg(i + 1));
qBtn.setShortcut(Qt::Key_F1 + i);
qGrid.addWidget(&qBtn, 1, i);
}
qWin.setLayout(&qGrid);
qWin.show();
// install signal handlers
for (int i = 0; i < N; ++i) {
QPushButton &qBtn = qBtns[i];
QObject::connect(&qBtn, &QPushButton::clicked,
[&qStack, i](bool) { qStack.setCurrentIndex(i); });
}
// run application
return qApp.exec();
}
我在Windows 10(64位)編譯和VS2013和Qt5.6測試
注意:
我測試過點擊按鈕以及使用相應的功能鍵。因此,我將重點放在QLineEdit
上,以確保它獨立於當前關注的小部件工作。
更新:
在OP,按鈕是硬件按鈕。因此,我修改了樣本的第一個版本,但沒有使用QPushButton
s。相同的效果可與QAction
S的直接加入到主窗口(使用QWidget::addAction()
)來實現:
// Qt header:
#include <QtWidgets>
int main(int argc, char **argv)
{
qDebug() << "Qt Version: " << QT_VERSION_STR;
// main application
#undef qApp // undef macro qApp out of the way
QApplication qApp(argc, argv);
// setup GUI
QWidget qWin;
QGridLayout qGrid;
enum { N = 5 };
QStackedLayout qStack;
struct Pane {
QWidget qWidget;
QVBoxLayout qVBox;
QLabel qLbl;
QLineEdit qTxt;
} panes[N];
for (int i = 0; i < N; ++i) {
Pane &pane = panes[i];
pane.qLbl.setText(QString::fromUtf8("<b>Pane %0</b>").arg(i + 1));
pane.qLbl.setTextFormat(Qt::RichText);
pane.qVBox.addWidget(&pane.qLbl, 1, Qt::AlignCenter);
pane.qVBox.addWidget(&pane.qTxt);
pane.qWidget.setLayout(&pane.qVBox);
qStack.addWidget(&pane.qWidget);
}
qGrid.addLayout(&qStack, 0, 0, 1, N);
qGrid.setRowStretch(0, 1);
QLabel qLbls[N];
for (int i = 0; i < N; ++i) {
QLabel &qLbl = qLbls[i];
qLbl.setText(QString::fromUtf8("F%0").arg(i + 1));
qGrid.addWidget(&qLbl, 1, i);
}
qWin.setLayout(&qGrid);
QAction *pQCmds[N];
for (int i = 0; i < N; ++i) {
QAction *pQCmd = pQCmds[i] = new QAction(&qWin);
pQCmd->setShortcut(Qt::Key_F1 + i);
qWin.addAction(pQCmd);
}
qWin.show();
// install signal handlers
for (int i = 0; i < N; ++i) {
QObject::connect(pQCmds[i], &QAction::triggered,
[&qStack, i](bool) { qStack.setCurrentIndex(i); });
}
// run application
return qApp.exec();
}
予編譯和VS2013和Qt5.6再次測試在Windows 10(64位):
注:
的QLineEdit
s的聚焦(每默認),而功能鍵已被用於切換QStackLayout
的當前索引。
我記得你可以安裝事件過濾器,它是在事件被「傳遞」之前觸發的。 (我沒有自己做 - 因此我只能提供這個粗略的提示......) – Scheff
請看看Qt文檔。 [事件過濾器](http://doc.qt.io/qt-5/eventsandfilters.html#event-filters)。這看起來有希望。甚至有一小部分的示例代碼'的QEvent :: KeyPress' ... – Scheff
另一種選擇可能是快捷方式(超出Qt的世界也被稱爲「快捷鍵」)... [SO:指定快捷鍵按鈕 - Qt的C++ (https://stackoverflow.com/q/4629629/7478597),[SO:如何編程自定義快捷鍵(https://stackoverflow.com/questions/17631601/how-to-program-custom-keyboard-快捷鍵)。 (奇怪,這不是我的第一個想法...) – Scheff