Qt去掉标题栏、不能移动、不能缩放后记

环境介绍

Qt 5.14.1 (MSVC 2017,32 bit)
Creator 4.11

隐藏Qt默认标题栏

关键的一句,看了其它blog发现一推冗余代码。。。

this->setWindowFlag(Qt::FramelessWindowHint);

实际情况如下图

MPlayer::MPlayer(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::MPlayer)
{
    ui->setupUi(this); 
     this->setWindowFlag(Qt::FramelessWindowHint);
}

或者这样

MPlayer::MPlayer(QWidget *parent)
    : QWidget(parent,Qt::FramelessWindowHint)
    , ui(new Ui::MPlayer)
{
    ui->setupUi(this); 
}

这样会产生下述问题
标题栏和边框都被去掉了,窗体拖动和大小缩放无效

解决窗体无法拖动问题

类的声明.h

class MPlayer : public QWidget
{
    Q_OBJECT
protected:
    void mousePressEvent(QMouseEvent *e);
    void mouseMoveEvent(QMouseEvent *e);
private:
    Ui::MPlayer *ui;
    QPoint pos;  //鼠标相对于窗口的位置,不是相对屏幕的位置
};
#endif // MPLAYER_H

类的实现.cpp

void MPlayer::mousePressEvent(QMouseEvent *e)
{//仅对鼠标左键响应,右键留着使用菜单功能
	if (e->button() == Qt::LeftButton)
    	pos = e->globalPos();
}
void MPlayer::mouseMoveEvent(QMouseEvent *e)
{//仅对鼠标左键响应,右键留着使用菜单功能
	if (!e->buttons().testFlag(Qt::LeftButton))
            return;
    int dx = e->globalX() - pos.x();
    int dy = e->globalY() - pos.y();
    pos = e->globalPos();
    move(x()+dx, y()+dy);
}

后记

这个拖动是实现实现的,也就意味着会比原来窗体拖动方式占据更多的计算资源,这个问题和WPS对比一下就知道了。
WPS也是用Qt造出来的,但是WPS拖动的方式和大多数应用一样都是鼠标释放之后在进行移动的,避免了中间的无用算力,这个算力浪费在旧电脑中会非常明显,一不小心就卡死了

问题总结

去掉标题栏后务必自定义关闭事件

加一个按钮,连接clicked槽

	this.close();

实时移动造成算力浪费有待解决

不能忍

不能缩放有待解决

将 Qt::FramelessWindowHint 替换为Qt::CustomizeWindowHint;这个样式不能移动但可以支持大小缩放,不能移动可以通过上面的办法解决,缺点就是标题栏没有完全去掉,有一丢丢的小白边,不过最大化状态下就看不到了。。。完美主义有待玩耍

你可能感兴趣的:(Qt)