Qt检测鼠标点击titleBar(Windows)

时间:2017-09-08 08:04:36

标签: qt winapi

event或mousePressEvent函数适用于小部件内部,但我想在点击titleBar(menuBar的上半部分,包含关闭按钮等)时捕获。

我该怎么做?

2 个答案:

答案 0 :(得分:1)

您可以覆盖nativeEvent,然后获取鼠标位置以与几何(排除窗口框架)和frameGeometry(包括窗口框架)进行比较,以检测它是否命中标题栏

bool MyClass::nativeEvent(const QByteArray & eventType, void * message, long * result)
{
    MSG* msg = (MSG*)(message);
    if (msg->message == WM_NCLBUTTONDOWN)
    {

        int mouseX = GET_X_LPARAM(msg->lParam);
        int mouseY = GET_Y_LPARAM(msg->lParam);
        QRect frame = frameGeometry();
        QRect content = geometry();

        qDebug() << "mouseX: " << mouseX << "mouseY:" << mouseY;
        qDebug() << "frame: " << frame;
        qDebug() << "content: " << content;

        if (mouseY < content.y() && mouseY >= frame.y())
        {
            qDebug() << "Hit title bar";
        }
    }

    *result = 0;
    return false;
}

答案 1 :(得分:0)

这是PyQt的实现。

def repeat(s, number):
    result = ''
    for _ in range(0, number):
         result += s
    return result

print(repeat("Hi", 3))

我对此一无所知,如果我再次单击标题栏而不单击菜单,菜单会发生什么。 菜单消失了,这允许我单击时移动标题栏-很好...但是我不能可靠地将菜单备份