- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
s-6ren">
我有一个带有关联菜单的工具按钮。
m_mainMenuButton = new ToolButton("menu.png", tr("Open menu"));
m_mainMenuButton->setMenu(m_mainMenu);
m_mainMenuButton->setPopupMode(QToolButton::InstantPopup);
我希望在用户按下并释放 Alt 时显示此菜单。这样正常的 QMenuBar
在 Windows 上被激活(我想要这个工具按钮而不是 QMenuBar
)。我试过这个:
m_mainMenuButton->setShortcut(QKeySequence(Qt::Key_Alt));
但是当按下并释放 Alt 时它不显示菜单。或者这样:
auto shortcut = new QShortcut(QKeySequence(Qt::Key_Alt), this);
connect(shortcut, &QShortcut::activated, m_mainMenuButton, &QToolButton::showMenu);
这也没有做任何事情。我试图覆盖按键和释放事件,但后来我发现它会干扰其他使用 Alt 键作为修饰符的快捷键,例如“Alt+Left”。
有什么办法吗?
更新一个显示 Alt 不能用作快捷方式的最小示例。
#include <QAction>
#include <QApplication>
#include <QLabel>
#include <QMainWindow>
#include <QMenu>
#include <QShortcut>
#include <QToolButton>
#include <QVBoxLayout>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QMainWindow w;
auto label = new QLabel();
auto menu = new QMenu(&w);
// intentionally added a shortcut which contains Alt as modifier to test it does not interfere with the menu
menu->addAction("Action", [label]{ label->setText("Trigered!"); }, QKeySequence("Alt+Left"));
auto btn = new QToolButton();
btn->setMenu(menu);
btn->setPopupMode(QToolButton::InstantPopup);
// the following lines do not have any effect, the menu is not shown when Alt is pressed and released
auto shortcut = new QShortcut(QKeySequence(Qt::Key_Alt), &w);
QObject::connect(shortcut, &QShortcut::activated, btn, &QToolButton::showMenu);
auto container = new QWidget();
auto layout = new QVBoxLayout(container);
layout->addWidget(btn);
layout->addWidget(label);
w.setCentralWidget(container);
w.show();
return a.exec();
}
最佳答案
这是一个受 Qt 在 QMenuBar 中的实现启发的版本:
class AltButton : public QToolButton {
public:
AltButton(QWidget *parent) : QToolButton(parent)
{
// To handle initial ALT-press in parent
parent->installEventFilter(this);
// If reparenting should be possible, override changeEvent
// You can also make an app-wide event filter if the button should catch all alt presses
}
protected:
bool altPressed = false;
bool eventFilter(QObject *watched, QEvent *event)
{
if (altPressed) {
// Alt-press registered before, check alt-Release
switch (event->type())
{
case QEvent::KeyPress:
case QEvent::KeyRelease:
{
QKeyEvent *kev = static_cast<QKeyEvent*>(event);
if (kev->key() == Qt::Key_Alt || kev->key() == Qt::Key_Meta) {
if (event->type() == QEvent::KeyPress)
break; // Alt-Press handled below by shortcut override
// Alt-Release. Toggle button
this->showMenu();
}
}
// fallthrough
case QEvent::MouseButtonPress:
case QEvent::MouseButtonRelease:
case QEvent::MouseMove:
case QEvent::FocusIn:
case QEvent::FocusOut:
case QEvent::ActivationChange:
case QEvent::Shortcut:
// These events cancel a alt-trigger
altPressed = false;
// Stop listening for global alt-releas
qApp->removeEventFilter(this);
break;
default:
break;
}
} else if (isVisible()) {
if (event->type() == QEvent::ShortcutOverride) {
QKeyEvent *kev = static_cast<QKeyEvent*>(event);
if ((kev->key() == Qt::Key_Alt || kev->key() == Qt::Key_Meta) && kev->modifiers() == Qt::AltModifier) {
// Alt-Press. Listen globally for alt-release
altPressed = true;
qApp->installEventFilter(this);
}
}
}
return false;
}
};
int main(int argc, char**argv) {
QApplication a(argc,argv);
QMainWindow w;
auto label = new QLabel();
auto menu = new QMenu(&w);
// intentionally added a shortcut which contains Alt as modifier to test it does not interfere with the menu
menu->addAction("Action", [label]{ label->setText("Trigered!"); }, QKeySequence("Alt+Left"));
auto btn = new AltButton(&w);
btn->setMenu(menu);
btn->setPopupMode(QToolButton::InstantPopup);
// the following lines do not have any effect, the menu is not shown when Alt is pressed and released
//auto shortcut = new QShortcut(QKeySequence(Qt::Key_Alt), &w);
//QObject::connect(shortcut, &QShortcut::activated, btn, &QToolButton::showMenu);
auto container = new QWidget();
auto layout = new QVBoxLayout(container);
layout->addWidget(btn);
layout->addWidget(label);
w.setCentralWidget(container);
w.show();
return a.exec();
}
Alt-Left 快捷键按预期工作,按钮菜单由 Alt-Pres-Release 切换。
关于c++ - QToolButton 在按下 Alt 后显示菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51816701/
当焦点出现在 QToolButton 上时,如何调整 QToolButton 的大小。我有 5 个 QToolButton,当焦点出现在第二个 QToolButton 上时,它的大小应该会自动增加。怎
我已将 QMenu 附加到 QToolButton,但菜单未正确反射(reflect)。 我正在通过读取 .txt 文件来填充我的 QMenu。菜单在第一次运行时显示正确的项目,但如果我在 .txt
我有一个 QToolButton。我想要文字和图标在上面。我通过 setToolButtonStyle(Qt::ToolButtonTextBesideIcon) 设置按钮样式。 但图标和文字彼此如此
我有一个 display.cpp 类,它有一个应该开始游戏的 QToolButton“开始”。我还有一个 singleton controller.cpp 类,它创建一个 display.cpp 对象
我有一个继承自 QWidget 的名为 Titlebar 的类。以下代码进入 Titlebar 类的构造函数: m_queueBtn = new QToolButton; m_serverToolBa
我试图做一个简单的设计来选择一种颜色,我正在使用 QToolButton 打开 QColorDialog。我的问题是我希望 QToolButton 具有选定的颜色,但我只成功设置了背景颜色,这不是我想
我正在尝试以编程方式使 QToolButton 在获得焦点时突出显示。我希望它像鼠标悬停选中时一样突出显示。这可能吗? 谢谢! 最佳答案 不确定您对样式表的熟悉程度,但这应该可以帮助您入门: QPus
如果我点击 QToolButton 按钮的箭头部分,会发出什么信号?单击的信号在我单击的任何地方发出,但我只需要在单击指定部分时检测。 最佳答案 你要做的就是拦截menu的aboutToShow信号,
当使用带有QToolButton的菜单时,菜单显示在按钮的正下方。有没有一种方法可以在按钮的左侧/右侧显示菜单? 最佳答案 该位置在[Qt安装目录]/src/gui/widgets/qtoolbutt
我正在使用多个 QToolButton s 自定义 QGridLayout小部件。这些按钮被设置为根据指定的默认 QAction 显示图标 + 文本。唯一的问题是内容(图标 + 文本)始终左对齐。 内
我想制作一个QToolButton,其中文本位于其图标的左侧。我尝试查找相关信息,并尝试了以下方法: button->setToolButtonStyle(Qt::ToolButtonTextBesi
我这里有两种不同的布局,一种是 QToolButton。我的目标是在单击该按钮时在两个布局之间转移该按钮。我认为这段代码可以工作, 片段: void DominionLinux::on_toolBut
我的代码片段如下所示: nextPageBtn = new QToolButton(); nextPageBtn->setSizePolicy(QSizePolicy::Expanding, QSiz
我想在QToolButton 中使用HTML 格式。例如在这张图片中,我应该在“Sara”和“Online”中创建QToolButton。 这是我的代码: viewControl=new QToolB
这是此 posting 的后续问题. 我正在尝试一种方法,在该方法中,我将 QToolButton 子类化并覆盖绘制事件,以便首先绘制一个红色矩形,然后在该矩形的顶部绘制文本。 我的代码大部分都在工作
我创建了一个简单的 10x10 黑框并将其添加到 QToolButton 中,如下所示: QIcon minIcon; minIcon.addFile("c:/tmp/black10x10.png")
我正在为 Mac OS X 开发 Qt 应用程序。问题是当我创建 QToolButton 时它会出现一些轮廓。 http://i.stack.imgur.com/vqtP9.png 我使用下一个样式表
我有一个 QToolButton,其中的文本使用 toolButton->setText(....)。但是,呈现按钮时文本会被截断。我尝试使用 resize() 和 setFixedSize 增加按钮
在 PyQt4 中,我有一个主窗口,单击设置按钮时将打开设置对话框 from PyQt4 import QtCore, QtGui import ui_Design, ui_Settings_Desi
我用我的 qt 设计器创建了一个 ToolButton,我试图将它连接到一个插槽。这是我写的 connect(ui->toolButton_addfiles, SIGNAL(triggered()),
我是一名优秀的程序员,十分优秀!