2011-11-05 56 views

回答

3

使用QWidget::move()来移动窗口。您检测用户何时按下(使用mousePressEvent())并保持(使用mouseMoveEvent())鼠标并使用这些增量值相应地移动窗口的左上角。

握住鼠标意味着在mousePressEvent()中设置一个标志并检查该标志是否在mouseMoveEvent()中设置。通过调用globalPos()QMouseEvent传递来获取光标的位置并保存,以便您知道调用mouseMoveEvent()之间的最后一个光标位置。然后计算最后位置和当前位置之间的差异,并将窗口移动到三角距离。

举个例子,这些添加到您的窗口类:

class Window : public QWidget { 

// .. 

protected: 
    void mousePressEvent(QMouseEvent *event); 
    void mouseReleaseEvent(QMouseEvent *event); 
    void mouseMoveEvent(QMouseEvent *event);           

private: 
    bool down; 
    QPoint lastPos; 
}; 

而且一个方法来实现它们是:

void Window::mousePressEvent(QMouseEvent *event) { 
    if (event->button() == Qt::LeftButton) { 
    down = true; 
    lastPos = event->globalPos(); 
    } 

    QWidget::mousePressEvent(event); 
} 

void Window::mouseReleaseEvent(QMouseEvent *event) { 
    down = false; 
    QWidget::mouseReleaseEvent(event); 
} 

void Window::mouseMoveEvent(QMouseEvent *event) { 
    if (down) { 
    QPoint curPos = event->globalPos(); 
    if (curPos != lastPos) { 
     QPoint diff = (lastPos - curPos); 
     move(pos() - diff); 
     lastPos = curPos; 
    } 
    } 

    QWidget::mouseMoveEvent(event); 
} 

现在左点击并按住在客户区移动窗口周围。

+0

你不需要'QCursor :: POS()',使用'QMouseEvent :: globalPos()'相反,它是已经传递给鼠标事件处理程序。 – Mat

+0

当然可以。 :) –

+0

我没有清楚这一点。其实我的问题是,通过在标题栏中放置窗口,我们可以将窗口移动到桌面上的任何位置,就像这样,我们可以通过将它放在窗口客户区中来实现此目的。我们可以通过您所说的来实现此目的吗? – user896036

0
#include <windows.h> 

void LeftClick (); 

int main(){ 
    Sleep(3000); 

    LeftClick(); //holds 5 sec. 
} 



void LeftClick () 
{ 
    INPUT Input={0}; 
    // left down 
    Input.type  = INPUT_MOUSE; 
    Input.mi.dwFlags = MOUSEEVENTF_LEFTDOWN; 
    ::SendInput(1,&Input,sizeof(INPUT)); 

    // left up 
    Sleep(5000); //this line is delaying key up ****** 
    ::ZeroMemory(&Input,sizeof(INPUT)); 
    Input.type  = INPUT_MOUSE; 
    Input.mi.dwFlags = MOUSEEVENTF_LEFTUP; 
    ::SendInput(1,&Input,sizeof(INPUT)); 
} 
相关问题