其他分享
首页 > 其他分享> > 关于在UI界面(QT,PyQT)中去除标题栏,实现自定义最大化,最小化,关闭等功能按钮

关于在UI界面(QT,PyQT)中去除标题栏,实现自定义最大化,最小化,关闭等功能按钮

作者:互联网

为什么要自己设计实现标题栏

想要用自己的就要先去掉别人的

MainWindow::setWindowFlags(Qt::FramelessWindowHint);//隐藏边框 
self.setWindowFlags(Qt.FramelessWindowHint) # 隐藏边框 

去掉标题栏后我们会失去什么

  1. 因此,去除边框后,首当其冲,UI界面会因为失去边框丢失调整大小的能力,表现出来的就是鼠标无法选中界面的边缘,达到拖动边缘改变大小的目的。

  2. 同时,因为改变界面在桌面上的位置原本由边框实现,去除边框后,UI与桌面不存在明确的布局关系,界面内容将无法移动。

  3. 原本程序的最大化(还原),最小化,关闭等功能由标题栏的按钮实现,去除标题栏后,该类操作界面的方式就会消失,不过我们仍可以通过底部状态栏右键操作界面。

  4. 总结而言,去除标题栏后,我们将无法通过按钮对界面进行最大化(还原),最小化,关闭等操作,无法拖动界面,也无法改变界面的大小,而这些也将是我们后续亟待实现的功能。

如何在程序中实现最大化(还原),最小化,关闭等操作

1. 放置按钮,调整位置,并修改成自己想要的风格。


QPushButton{background-color:rgba(0,0,0,0);} 

QPushButton:hover{background-color:rgba(255,255,255,0.5);} 

QPushButton:pressed{background-color: rgba(100,100,100,1);}; 

2. 准备好符合自己界面风格的各按钮标志,并提前添加到QT的素材文件(.qrc)里。

3. 关闭按钮实现。

void MainWindow::on_pushButton_close_clicked() 
{ 
    MainWindow::close();//关闭事件 
} 
self.pushButton_close.clicked.connect(self.close) 
void MainWindow::closeEvent(QCloseEvent *event) 
{ 

} 
# 关闭主窗口时清理资源 
def closeEvent(self, event): 
    data = "---Visual shield tail clearance measurement system off." 
    ms = Measurement_data_sava(cctv_par.address, data, forma=4, save_lev=1, log_lev=0)       
    kill_name(uwb_par.name_pid) 

4. 最大化(还原)按钮实现,最小化按钮实现。

void MainWindow::on_pushButton_maximize_clicked() 
{ 
    if (MainWindow::isMaximized()) 
    { 
        MainWindow::showNormal();//还原事件 
        ui->pushButton_maximize->setIcon(QIcon(QPixmap(":/new/new/max.png"))); 
    } 
    else 
    { 
        MainWindow::showMaximized();//最大化事件 
        ui->pushButton_maximize->setIcon(QIcon(QPixmap(":/new/new/back.png"))); 
    } 
} 
# 调用 
self.pushButton_max .clicked.connect(self.maxornormale) 

# 最大化按钮功能
def maxornormale(self):
    if self.isMaximized():
        self.flgs_max_normal=0
        self.showNormal()
        icon7 = QtGui.QIcon()
        icon7.addPixmap(QtGui.QPixmap(":/newPrefix/resource/icon/max.png"), QtGui.QIcon.Normal,
                        QtGui.QIcon.Off)
        self.pushButton_max.setIcon(icon7)
    else:
        self.flgs_max_normal = 1
        self.showMaximized()
        icon6 = QtGui.QIcon()
        icon6.addPixmap(QtGui.QPixmap(":/newPrefix/resource/icon/back.png"), QtGui.QIcon.Normal,
                        QtGui.QIcon.Off)
        self.pushButton_max.setIcon(icon6)
void MainWindow::on_pushButton_minimize_clicked() 
{ 
    MainWindow::showMinimized(); 
} 
self.pushButton_min .clicked.connect(self.showMinimized) 

实现界面移动

1. 通过鼠标点击事件,识别鼠标左键按下操作,并记录当前位置:

void MainWindow::mousePressEvent(QMouseEvent *event)
{
    if(event->button() == Qt::LeftButton)
    {
        whereismouse=event->pos();
    }

}
# 鼠标事件,按下按键
def mousePressEvent(self, e):
    if e.buttons() == QtCore.Qt.LeftButton:
        try:
            self.mos = e.pos()
        except:
            pass

2. 通过鼠标移动事件,计算鼠标光标的坐标变化,并借助move事件使界面进行相同的移动。

void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
    if(event->buttons() == Qt::LeftButton)
    {
        if(MainWindow::isMaximized() || MainWindow::isMinimized())
        {
            return;
        }
        else
        {
            if (ui->groupBox_top->underMouse())
            {
                if(ui->groupBox_2->underMouse())
                {

                }
                else
                {
                    MainWindow::move(MainWindow::mapToGlobal(event->pos()-whereismouse));
                }
            }
        }
    }
    event->accept();
}

# 鼠标移动事件
def mouseMoveEvent(self, event):
    if self.pushButton_tip.underMouse():
        pass
    elif self.pushButton_4.underMouse():
        pass
    elif self.pushButton_5.underMouse():
        pass
    else:
        try:
            if event.buttons() == Qt.LeftButton and self.mos:
                self.move(self.mapToGlobal(event.pos() - self.mos))
            event.accept()
        except:
            pass

标签:界面,QT,自定义,--,self,标题栏,按钮,鼠标
来源: https://www.cnblogs.com/DITANG/p/15499836.html