- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在这里和其他类似 qtcentre 的地方搜索我看到这个问题已经出现但似乎无法让它工作。我有一个带有 QSplitter 的 MainWindow 小部件,它包含两个 Pane 小部件(从 QFrame 子类化)。每个 Pane 都有一个菜单栏,其中包含相同的相关QActions/Shortcuts。
我已经尝试了 ShortcutContexts 与 setShortcutContext() 的所有组合。
WindowShortcut 和 ApplicationShortcut 上下文给出了预期的“不明确的快捷方式过载”。
虽然 WidgetShortcut 和 WidgetWithChildrenShortcut 都什么都不做。
如果我手动激活菜单,它们当然可以正常工作。我还尝试过使用重载的 enterEvent() 强制关注父小部件。
有什么想法吗?
谢谢。
#include <QMainWindow>
#include <QFrame>
QT_BEGIN_NAMESPACE
class QAction;
class QMenu;
class QHBoxLayout;
class QSplitter;
class QWidget;
QT_END_NAMESPACE
class Pane: public QFrame
{
Q_OBJECT
public:
Pane(QWidget* parent = 0);
protected:
void enterEvent(QEvent *event);
void leaveEvent(QEvent *event);
private:
void createMenus();
QMenuBar * m_menuBar;
private Q_SLOTS:
void split();
};
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow();
private:
void createActions();
void createMenus();
void setupUi(QMainWindow *MainWindow);
QMenu *fileMenu;
QAction *exitAct;
QWidget *centralwidget;
QHBoxLayout *horizontalLayout;
QSplitter *splitter;
QFrame *frame;
QFrame *frame_2;
};
#include <iostream>
#include <QApplication>
#include <QMainWindow>
#include <QSplitter>
#include <QFrame>
#include <QMenuBar>
#include <QBoxLayout>
#include "main.h"
Pane::Pane(QWidget* parent) :
QFrame(parent)
{
setFrameShape(QFrame::StyledPanel);
setFrameShadow(QFrame::Raised);
QVBoxLayout *layout = new QVBoxLayout;
QFrame::setLayout(layout);
m_menuBar = new QMenuBar;
QWidget *m_widget = new QWidget;
layout->addWidget(m_menuBar);
layout->addWidget(m_widget);
layout->setContentsMargins(2, 2, 2, 2);
show();
createMenus();
}
void
Pane::enterEvent(QEvent *event)
{
std::cout << "enter" << std::endl;
setFocus();
setStyleSheet("QFrame { border: 1px solid rgb(127, 127, 0); }");
if (focusWidget())
std::cout << "focuswidget = " << focusWidget()->objectName().toUtf8().constData() << std::endl;
}
void
Pane::leaveEvent(QEvent *event)
{
std::cout << "leave" << std::endl;
clearFocus();
setStyleSheet("QFrame { border: 1px solid rgb(64, 64, 64); }");
}
void
Pane::split()
{
std::cout << "split pane" << std::endl;
}
void
Pane::createMenus()
{
QMenu *paneMenu = m_menuBar->addMenu(tr("&Pane"));
QAction *paneSplitAct = new QAction(tr("Split"), this);
paneSplitAct->setShortcut(Qt::Key_S);
paneSplitAct->setShortcutContext(Qt::WidgetWithChildrenShortcut);
paneSplitAct->setStatusTip(tr("Split Pane"));
connect(paneSplitAct, SIGNAL(triggered()), this, SLOT(split()));
paneMenu->addAction(paneSplitAct);
}
MainWindow::MainWindow()
{
setupUi(this);
createActions();
createMenus();
}
void MainWindow::createActions()
{
exitAct = new QAction(tr("E&xit"), this);
exitAct->setShortcuts(QKeySequence::Quit);
exitAct->setStatusTip(tr("Exit the application"));
connect(exitAct, SIGNAL(triggered()), this, SLOT(close()));
}
void MainWindow::createMenus()
{
fileMenu = menuBar()->addMenu(tr("&File"));
fileMenu->addAction(exitAct);
}
void MainWindow::setupUi(QMainWindow *MainWindow)
{
if (MainWindow->objectName().isEmpty())
MainWindow->setObjectName(QString::fromUtf8("MainWindow"));
MainWindow->resize(800, 600);
centralwidget = new QWidget(MainWindow);
centralwidget->setObjectName(QString::fromUtf8("centralwidget"));
horizontalLayout = new QHBoxLayout(centralwidget);
horizontalLayout->setObjectName(QString::fromUtf8("horizontalLayout"));
splitter = new QSplitter(centralwidget);
splitter->setObjectName(QString::fromUtf8("splitter"));
splitter->setOrientation(Qt::Horizontal);
frame = new Pane(splitter);
frame->setObjectName(QString::fromUtf8("frame"));
splitter->addWidget(frame);
frame_2 = new Pane(splitter);
frame_2->setObjectName(QString::fromUtf8("frame_2"));
splitter->addWidget(frame_2);
horizontalLayout->addWidget(splitter);
MainWindow->setCentralWidget(centralwidget);
QMetaObject::connectSlotsByName(MainWindow);
}
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
app.setOrganizationName("Trolltech");
app.setApplicationName("Application Example");
MainWindow mainWin;
mainWin.show();
return app.exec();
}
HEADERS = main.h
SOURCES = main.cpp
CONFIG += no_keywords
更新:在 Pane::createMenus()
的末尾添加一个 addAction(paneSplitAct)
调用并结合使用 Qt::WidgetShortcut
上下文似乎可以提供我想要什么。
根据我对文档的理解,这应该在小部件中创建上下文菜单。我似乎没有得到一个(我假设单击鼠标右键)但是没关系,因为我不想要一个。 eventEvent()
和 leaveEvent()
重写仍然需要正确设置焦点。
最佳答案
我遇到过类似的问题:2 个不同的小部件具有相同的操作快捷方式(小部件之间的不同操作)。只要应用程序中只有一个小部件可见,一切正常。一旦两者都可见,我就收到了这条“模棱两可的快捷方式过载”消息。
解决方案是:两个 Action 的上下文都必须正确设置为 Qt::WidgetWithChildrenShortcut,然后它工作正常 - 只是根据当前焦点。
如果只有一个操作具有正确的上下文,则触发具有默认上下文的操作并显示消息。
如果两个操作都没有设置上下文(默认),则触发最后创建的操作并显示消息。
因此,如果您在任何地方添加带有快捷方式的操作,请记住考虑正确的上下文并进行设置,要有限制!
关于c++ - QT - QAction::eventFilter:不明确的快捷方式重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10345565/
这已经困扰我两天多了,所以我想我应该问一下。我在 Win7 上使用 Qt 4.5.3(用 VC2008 编译)。 我有 MyGraphicsView(继承 QGraphicsView)和 MyFilt
我可以设置我的eventFilter来忽略小部件的“默认”事件,例如。 mousePressEvents 等?或者这两者可以混合在一起吗? 在我的代码中,我有一个 mousePressEvent 和一
我的自定义标签上有一个 eventFilter,我想用它来嗅探双击。这可能吗? self.installEventFilter(self) # Handles mouse events def
我有一个小问题,我需要将我的事件过滤器设置为 QComboBox 弹出窗口。我需要在按下左右键时捕获事件。我该怎么做? 谢谢! 最佳答案 您需要在 QComboBox 的 view() (http:/
我已经用谷歌搜索了一段时间,我发现基本上,一些网页说没有大的差异。除了一些点: EventFilter 在 EventHandler 之前执行 EventFilter 对 event.Consume(
我有一个带有数百个自定义按钮的应用程序,每个按钮都需要多个信号连接。连接调用似乎非常慢,因此我尝试使用输入和离开事件通过主窗口的 eventFilter 连接/断开每个按钮的信号。 但是,有时这些事件
我的程序使用一个 ui-form-file,它在其他小部件旁边包含一个名为“grip”(其对象名称)的标签。当我运行代码时,我看到代码行 grip was not detected 并且我想知道为什么
我正尝试在 PyQT5 中实现一个事件,但出现此错误: TypeError: installEventFilter(self, QObject): argument 1 has unexpected
我的事件过滤器存在根本性错误,因为它让每个 单个事件通过,而我想停止一切。我已经阅读了很多关于 QEvent、eventFilter() 等的文档,但显然我遗漏了一些重要的东西。本质上,我正在尝试基于
在这里和其他类似 qtcentre 的地方搜索我看到这个问题已经出现但似乎无法让它工作。我有一个带有 QSplitter 的 MainWindow 小部件,它包含两个 Pane 小部件(从 QFram
我在我的 QLineEdit 上安装了一个 EventFilter,这样我就可以处理焦点事件以允许 QFileDialog 在它出现时显示获得焦点。 我添加了以下几行: QLineEdit *proj
我正在尝试创建一个 QLineEdit 元素,其文本将在单击时自动复制到剪贴板。 我创建了以下 eventFilter 来捕获点击事件并将其安装在适用的元素上: bool MainWindow::ev
当我在其中一个行编辑器中插入一个数字时,我想让一个按钮可见。按钮和 linedit 在同一行。我知道 lineedit 的位置或名称,但我不知道如何链接回按钮以使其可见或能够更改颜色。 如果您查看 e
我希望在选择 qtreeview 时按下回车键时发生“事件”。因为我不喜欢将 qtreeview 子类化(对设计者来说更容易)——我尝试安装一个事件过滤器。然而,这似乎没有用: 该类仅包含一个公共(p
我遇到了 QTextEdit 的问题。我正在为 QTextEdit 使用 eventFilters。当我在 QTextEdit 中按下小键盘 (0-9) 中的键时,它将自动完成句子这是连接那个号码。例
我是这里的 Qt 新用户。我有一个项目,我要使用 pyuic 生成的 .py 文件,但我无权访问它。 我还应该在某些对象上安装事件过滤器。是否可以在生成的 .py 文件之外使用 object.inst
它根本不起作用。我启用了鼠标跟踪,然后安装了事件过滤器,一切正常,除了 MouseMove 事件。有什么帮助吗? #include "mainwindow.h" #include "ui_mainwi
我希望能够删除使用 lambda 设置的事件过滤器。我不确定这是否可能? 我看过这个使用内部类的例子:http://www.java2s.com/Tutorials/Java/JavaFX/1120_
当我的鼠标位于labelname(QLabel)时,我希望我的程序打印“mouse on label name”,并打印“mouse not on label” name"当我的鼠标不在 labeln
我尝试创建一个可以处理放置事件的 QTableView。出于应用程序架构的原因,我希望通过我的 eventFilter 来完成(它也处理一些用于剪贴板交互的 QAction 触发器)。但是 drop-
我是一名优秀的程序员,十分优秀!