QT自定义标题栏

本文详细介绍了如何在QT框架中实现自定义标题栏、隐藏标题栏以及窗口移动功能。通过设置窗口标志、重写鼠标事件处理函数,实现了高效和低效两种方式的窗口移动。此外,还展示了如何在Windows平台上实现窗口边缘半屏和最大化功能,以及窗口最小化、关闭和最大化的处理方法。同时,文章提到了在QT环境下利用Windows API进行窗口操作的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

QT

自定义标题栏

隐藏标题栏

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

窗口移动

方法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);
}  

这种方式实现的窗口移动 每次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  
    }
}

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

    //设置属性产生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;
}

最小化

void MyWidget::slot_OnMinClicked()
{
    this->showMinimized();
}

关闭

void MyWidget::slot_OnCloseClicked()
{
    this->close();
}

最大化

void MyWidget::slot_OnMaxClicked()
{
    this->isMaximized() ? this->showNormal() : this->showMaximized();
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值