- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在带有 C++ 的 Qt 中,我创建了一个窗口,里面有一个小的 QWidget。
每次 QEvent::Enter
、QEvent::Leave
或 QEvent::MouseMove
被触发时,小 QWidget 都会显示一条消息。
当在小 QWidget 之外按下(并保持)任何鼠标按钮,并且鼠标移动到这个小 QWidget 的顶部(按住时),QEvent::MouseMove
不会被触发对于这个小 QWidget。此外,QEvent::Enter
被推迟到鼠标按钮释放之后。
在相反的情况下:当鼠标在小 QWidget 上按下(并保持),然后鼠标移到外面时,QEvent::Leave
被推迟到鼠标按钮按下之后发布。
是否有任何解决方案可以始终检索 QEvent::MouseMove
,即使在按住鼠标按钮时也是如此?
附加数据:是的,setMouseTracking(true)
已设置。
测试示例:
小部件:
#ifndef MYWIDGET_HPP
#define MYWIDGET_HPP
#include <QWidget>
#include <QStyleOption>
#include <QPainter>
#include <QEvent>
#include <QDebug>
class MyWidget: public QWidget
{
Q_OBJECT
public:
MyWidget( QWidget* parent=nullptr ): QWidget(parent)
{
setMouseTracking(true);
}
protected:
// Paint for styling
void paintEvent(QPaintEvent *)
{
// Needed to allow stylesheet.
QStyleOption opt;
opt.init(this);
QPainter p(this);
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}
// Show Enter and Leave event for debugging purpose
bool event( QEvent *e)
{
static int counting=0;
if (e->type() ==QEvent::Enter)
{
qDebug() << counting++ << " Enter: " << this->objectName();
}
if (e->type() ==QEvent::Leave)
{
qDebug() << counting++ << " Leave: " << this->objectName();
}
if (e->type() ==QEvent::MouseMove)
{
qDebug() << counting++ << " Move: " << this->objectName();
}
return QWidget::event(e);
}
};
#endif // MYWIDGET_HPP
主要
#include <QApplication>
#include <QDebug>
#include <QWidget>
#include <QTimer>
#include "Testing.hpp"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// Create a main window
QWidget main;
main.setWindowTitle("Cursor blocked for 5s - wait and see");
main.resize(500, 200);
main.move(200, 200);
// Create a MyWidget
MyWidget sub(&main);
sub.setObjectName("sub");
sub.resize(50, 50);
sub.move(50, 50);
// Style the button with a hover
main.setStyleSheet
(
"QWidget#sub{background-color: rgba(0,0,128,0.5);}"
"QWidget#sub:hover{background-color: rgba(128,0,0,0.5);}"
);
// Show the window
main.show();
return a.exec();
}
项目
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
SOURCES +=\
main.cpp
HEADERS +=\
Testing.hpp
RESOURCES +=\
CONFIG += c++11 -Wall
TARGET = Testing
TEMPLATE = app
最佳答案
这是标准行为。当您按下鼠标按钮时,小部件开始抓取它(调用 QWidget::grabMouse
)。我认为当您需要全局跟踪鼠标时,您应该重新设计您的行为,或者解释一些真实的用例。
如果你真的需要跟踪鼠标,你可以使用事件过滤器。
伪代码(没有检查):
QWidget *otherWidget = /*...*/;
QWidget *myWidget = /*...*/;
otherWidget->installEventFilter( myWidget );
// you need to install filter on each widget,
// that you want to track.
// Care with performance
MyWidget : QWidget
{
void handleMouseMove( QPoint pos ) { /*...you code...*/ }
void mouseMove( QMouseEvent *e ) override;
{
handleMouseMove( e->pos() );
QWidget::mouseMove( e );
}
bool eventFilter( QObject *obj, QEvent *e )
{
auto srcWidget = qobject_cast< QWidget * >( obj );
switch ( e->type() )
{
case QEvent::MouseMove:
{
auto me = static_cast< QMouseEvent * >( e );
auto globalPos = srcWidget->mapToGlobal( me->pos() );
auto localPos = this->mapFromGlobal( globalPos ); // Possible, you need to invalidate that poing belongs to widget
handleMouseMove( localPos );
}
break;
};
return QWidget::eventFilter( obj, e );
}
};
关于c++ - 使用按下按钮输入时,QWidget 不会触发 QEvent::MouseMove,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29294905/
此时,程序显示两种选择并打印一条语句,表明用户赢了、计算机赢了还是平局。继续玩直到用户选择停止,然后打印用户赢的次数,损失, 和关系. import java.util.Scanner; import
我想在 d3.js 中制作一个条形图,每个项目或行都有正条和负条,如下所示: 它有点像谷歌金融“行业摘要”图表(http://google.com/finance) 任何人都可以指出我这种图表的 d3
尝试根据 GF 和 GA 创建一个新列“Results”。想知道如何通过定义函数和条件语句来做到这一点。以下是我对一行的初步尝试,但无法弄清楚如何将其应用于所有行,非常感谢您的帮助! 日期地点对手GF
我对 Java 还很陌生,并且有一项任务被困住了。我相信我的 boolean 函数是正确的,但是我不知道在主函数中要写什么。 这是作业: 编写一个公共(public)函数(静态方法)winner(in
使用掷骰子游戏中的 10,000 次模拟来计算获胜概率 (wins/(wins + Loss))。下面是双骰子游戏的方法: public class CrapsGame { public st
我是一名优秀的程序员,十分优秀!