gpt4 book ai didi

c++ - 在小部件中获取 QKeyEvents 的好方法是什么?

转载 作者:行者123 更新时间:2023-11-28 05:26:58 28 4
gpt4 key购买 nike

使用Qt-5.7.0,我想要一个QSpinBox来设置超时值。该值可以以秒或分钟为单位。我会在 SpinBox 后面放一个 QLabel 来说明它是什么。

现在,当用户操作控件时,我希望它根据是否按下 Shift 键从秒变为分钟。因此,例如,当光标位于旋转框上但没有移动时,标签将显示 Minutes 并且旋转框数字可以递增或递减。

但是,当光标位于旋转框上并按下 shift 时,标签将切换为 Seconds,旋转框值将更改为 previous_value * 60,并且值可以更改。

使用 QtCreator,我将 QSpinBox 和 QLabel 放在 QFrame 中,所以所有东西都在正确的位置,但我没有看到任何可以获取 Shift 状态的插槽。我可以在 SpinBox on_SB_valueChanged() 函数中检查 shift,但我真的希望 按下 shift 按钮时发生变化,不只是在值更改时(我发现按下了 shift 按钮)。

是否有管理此类事情的标准方法? (我想我可以制作一个自定义小部件来执行此操作,但也许有更简单的方法?)如何将此类自定义小部件放置在 QtCreator 中?

最佳答案

你可以 use an event filter并将其附加到股票小部件以拦截事件而不是扩展小部件。

下面是一些应该或多或少可以工作的代码,尽管我个人更喜欢有一个小的切换按钮来在分钟和秒之间切换,这样会更直观并且更不容易出错:

class Filter : public QObject {
Q_OBJECT
QLabel * l;
public:
Filter(QLabel * ll) : l(ll) {}
bool eventFilter(QObject *, QEvent *e) {
switch (e->type()) {
case QEvent::Wheel:
case QEvent::KeyPress:
case QEvent::KeyRelease:
if (QApplication::keyboardModifiers() & Qt::ShiftModifier) l->setText("shift");
else l->setText("noshift");
}
return false;
}
};

class Widget : public QWidget {
Q_OBJECT
public:
Widget(QWidget *parent = 0) : QWidget(parent) {
auto ll = new QVBoxLayout(this);
setLayout(ll);
ll->addWidget(l = new QLabel(this));
ll->addWidget(s = new QSpinBox(this));
s->installEventFilter(new Filter(l));
}
private:
QLabel * l;
QSpinBox * s;
};

关于c++ - 在小部件中获取 QKeyEvents 的好方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40352746/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com