Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt不能提供实时数据“;“正在拖动窗口”;事件_Qt - Fatal编程技术网

Qt不能提供实时数据“;“正在拖动窗口”;事件

Qt不能提供实时数据“;“正在拖动窗口”;事件,qt,Qt,这里有一个看似无辜的简单任务。小部件窗口。每当它在桌面上拖动时(用鼠标抓住标题栏并移动),它应该在移动过程中实时打印出它的X和Y位置。 听起来很简单,但在Qt中似乎不可能做到这一点 无论我做什么,当我捕捉到标题并移动窗口时,我都无法获取实时事件。我有一个事件过滤器,但在拖动过程中只有零星的几个事件进入——moveEvents等只有在我释放鼠标按钮之后才会出现。我需要每一个移动像素的实时事件(或者至少每次窗口在屏幕上实际移动时,尽可能接近实时) 有没有一种不用在操作系统上钻孔就能做到这一点的方法

这里有一个看似无辜的简单任务。小部件窗口。每当它在桌面上拖动时(用鼠标抓住标题栏并移动),它应该在移动过程中实时打印出它的X和Y位置。

听起来很简单,但在Qt中似乎不可能做到这一点

无论我做什么,当我捕捉到标题并移动窗口时,我都无法获取实时事件。我有一个事件过滤器,但在拖动过程中只有零星的几个事件进入——moveEvents等只有在我释放鼠标按钮之后才会出现。我需要每一个移动像素的实时事件(或者至少每次窗口在屏幕上实际移动时,尽可能接近实时)

有没有一种不用在操作系统上钻孔就能做到这一点的方法


我正在Mac上使用Qt。

这是我首先想到的。此解决方案不提供实时事件处理,但我认为它非常接近它。如果您移动窗口的速度足够慢,您可以捕捉像素精度的移动。好的,现在实现(我相信代码解释了它是如何工作的):

class小部件:公共QWidget
{
Q_对象
公众:
小部件(QWidget*parent=0):QWidget(parent)
{
m_定时器设置间隔(1);
连接(&m_定时器,信号(timeout()),此,插槽(onTimer());
m_timer.start();
}
专用插槽:
void onTimer()
{
如果(m_lastPos!=pos()){
//窗户动了。
m_lastPos=pos();

qDebug()是的。我想这可能是解决方案。担心CPU使用率会保持不变。但也许通过智能管理,您可以捕获非客户端窗口标题mouseDown事件(当您开始拖动时)非客户端窗口标题mouseUp event和仅在这些事件之间启动/停止计时器-当应用程序处于空闲模式时,它不会占用CPU是的,正确。当然,这个示例可以优化和改进。真正的问题是:操作系统是否真的提供此类事件。如果提供,则不需要钻任何孔,只需添加一个本机事件阿尔特。
class Widget : public QWidget
{
    Q_OBJECT
public:
    Widget(QWidget *parent = 0) : QWidget(parent)
    {
        m_timer.setInterval(1);
        connect(&m_timer, SIGNAL(timeout()), this, SLOT(onTimer()));
        m_timer.start();
    }

private slots:
    void onTimer()
    {
        if (m_lastPos != pos()) {
            // Window moved. 
            m_lastPos = pos();
            qDebug() << "Moved to:" << m_lastPos;
        }
    }

private:
    QPoint m_lastPos;
    QTimer m_timer;
};