当前位置:   article > 正文

QT自定义标题栏

qt自定义标题栏

QT

自定义标题栏

隐藏标题栏

    setWindowFlags(Qt::FramelessWindowHint | windowFlags());
  • 1

窗口移动

方法1:

重写下面三个函数

void MyWidget::mousePressEvent(QMouseEvent *event)  
{  
    if (event->button() == Qt::LeftButton) {  
        m_bPressed = true;  
        m_StartPoint = event->globalPos() - this->pos();  
        event->accept();  
    }  
}  
  
void MyWidget::mouseMoveEvent(QMouseEvent *event)  
{         
    QPoint currentPoint = event->globalPos();
    if (m_bPressed)
    {  
        this->move(this->geometry().topLeft() + currentPoint - m_StartPoint);
    }  
}  
  
void MyWidget::mouseReleaseEvent(QMouseEvent *)  
{  
   if (event->button() == Qt::LeftButton)
    {
        m_bPressed = false;
    }
	return QWidget::mouseReleaseEvent(event);
}  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

这种方式实现的窗口移动 每次move时都会触发事件,计算位置,移动窗口,重绘窗口效率并不高

方法2

windows平台下可以使用

void MyWidget::mousePressEvent(QMouseEvent *event)
{
    QRect rect = ui.widget_4->rect();

    if (event->button() == Qt::LeftButton)
    {
        
#ifdef Q_OS_WIN
        if (ReleaseCapture())
        {
            SendMessage((HWND)this->winId(), WM_SYSCOMMAND, SC_MOVE | HTCAPTION, 0);
        }
#endif // Q_OS_WIN  
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

窗口移动到边缘半屏或者最大化

    //设置属性产生win窗体效果,移动到边缘半屏或者最大化等
    //设置以后会产生标题栏需要在下面拦截消息重新去掉
#ifdef Q_OS_WIN
    HWND hwnd = (HWND)this->winId();
    DWORD style = ::GetWindowLong(hwnd, GWL_STYLE);
    ::SetWindowLong(hwnd, GWL_STYLE, style | WS_MAXIMIZEBOX | WS_THICKFRAME | WS_CAPTION);
#endif

//在nativeEvent需要拦截消息WM_NCCALCSIZE
bool MyWidget::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
    Q_UNUSED(eventType);

    MSG *msg = static_cast<MSG*>(message);
    switch (msg->message)
    {
    case WM_NCCALCSIZE:
        *result = 0;
        return true;
    default:
        return false;
        break;
    }
    return false;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

最小化

void MyWidget::slot_OnMinClicked()
{
    this->showMinimized();
}
  • 1
  • 2
  • 3
  • 4

关闭

void MyWidget::slot_OnCloseClicked()
{
    this->close();
}
  • 1
  • 2
  • 3
  • 4

最大化

void MyWidget::slot_OnMaxClicked()
{
    this->isMaximized() ? this->showNormal() : this->showMaximized();
}
  • 1
  • 2
  • 3
  • 4
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/234965
推荐阅读
相关标签
  

闽ICP备14008679号