我想处理所有子窗口小部件的按键事件,我正在尝试下面的事情:
Widget::Widget(QWidget *parent):QWidget(parent)
{
QGroupBox *gBox = new QGroupBox(this);
QPushButton *button1 = new QPushButton("1");
QPushButton *button2 = new QPushButton("2");
QVBoxLayout *vBox = new QVBoxLayout;
vBox->addWidget(button1);
vBox->addWidget(button2);
gBox->setLayout(vBox);
gBox->installEventFilter(this);
button1->installEventFilter(this);
button2->installEventFilter(this);
}
bool Widget::eventFilter(QObject *obj, QEvent *event)
{
if (event->type() == QEvent::KeyPress)
{
if(obj == gBox)
{
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
if(keyEvent->key() == Qt::Key_F1)
{
emit somesignal();
}
}
if(obj == button1)
{
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
if(keyEvent->key() == Qt::Key_F1)
{
emit somesignal1();
}
}
if(obj == button2)
{
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
if(keyEvent->key() == Qt::Key_F1)
{
emit somesignal2();
}
}
}
return QObject::eventFilter(obj, event);
}
但是当我按 F1 时,只会发出somesignal()
。我想为somesignal1()
和somesignal2()
发出button1
,button2
。
有人可以帮助我实现这个目标吗?
答案 0 :(得分:0)
您应该实现一个全局窗口QShortcut
,并使用qApp->focusWidget()
来确定您需要帮助的窗口小部件。您应该使用属性框架来设置窗口小部件的帮助URL:
const char kHelpUrl = "helpUrl";
void setHelpUrl(QWidget * w, const QUrl & url) {
w->setProperty(kHelpUrl, url);
}
QUrl getFocusedHelpUrl() {
auto w = qApp->focusWidget();
return w ? w->property(kHelpURL).value<QUrl>() : QUrl{};
}
void showHelp() {
auto url = getFocusedHelpUrl();
...
}
class MainWin : public QDialog {
...
QPushButton button1{"Hello"};
QPushButton button2{"GoodBye"};
public:
MainWin(QWidget * parent = nullptr) : QDialog{parent}
{
setHelpUrl(&button1, {"qthelp://button1"});
setHelpUrl(&button2, {"qthelp://button2"});
...
}
};
int main(int argc, char ** argv) {
QApplication app{argc, argv};
...
MainWindow mainWin;
QShortcut s{QKeySequence::HelpContents, &mainWin};
QObject::connect(&s, &QShortcut::activated, showHelp);
...
return app.exec();
}