[软件开发] PyQt5中,同样一份代码,多出来了莫名奇妙的按钮焦点
电梯直达到第
poster avatar
把一切操作变成GUI
deepin
生态共建组骨干
发表于 2024-08-24 01:09
楼主

同样一份代码,

import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from default import *

class TitleBar(QWidget):
    def __init__(self, parent):
        super(TitleBar, self).__init__()
        self.win = parent
        self.InitializeWindow()

    def InitializeWindow(self):
        self.isPressed = False
        self.setFixedHeight(TITLE_BAR_HEIGHT)
        self.InitializeViews()
        pass

    def InitializeViews(self):
        self.iconLabel = QLabel(self)
        self.titleLabel = QLabel(self)

        #设置标题栏的字体或者样式
        # self.titleLabel.setProperty('class', 'title_style')  # 设置样式表类
        self.titleLabel.setObjectName('titleLabel')

        self.minButton = QPushButton(self)
        # self.minButton.setFocusPolicy(Qt.NoFocus)


        self.restoreButton = QPushButton(self)
        self.closeButton = QPushButton(self)

        self.minButton.setFixedSize(TITLE_BUTTON_SIZE, TITLE_BUTTON_SIZE);
        self.restoreButton.setFixedSize(TITLE_BUTTON_SIZE, TITLE_BUTTON_SIZE);
        self.closeButton.setFixedSize(TITLE_BUTTON_SIZE, TITLE_BUTTON_SIZE);

        #设置logo和标题尺寸,Fixed为固定
        self.iconLabel.setFixedSize(TITLE_LABEL_SIZE, TITLE_LABEL_SIZE);
        # self.titleLabel.setFixedHeight(TITLE_LABEL_SIZE);

        self.iconLabel.setAlignment(Qt.AlignCenter);
        self.titleLabel.setAlignment(Qt.AlignLeft|Qt.AlignVCenter);

        self.minButton.setIcon(QIcon(TITLE_MIN_ICON));
        self.restoreButton.setIcon(QIcon(TITLE_RESTORE_ICON));
        self.closeButton.setIcon(QIcon(TITLE_CLS_ICON));

        #信号槽连接
        self.minButton.clicked.connect(self.ShowMininizedWindow)
        self.restoreButton.clicked.connect(self.ShowRestoreWindow)
        self.closeButton.clicked.connect(self.CloseWindow)

        self.lay = QHBoxLayout(self)
        self.setLayout(self.lay)

        self.lay.setSpacing(0)
        self.lay.setContentsMargins(0, 0, 0, 0)

        # 创建一个占位控件,并设置其最小宽度为20px
        # spacer = QWidget(self)
        # spacer.setFixedWidth(20)  # 这将使得图标向右移动20px
        # spacer.setObjectName('Spacer') 


        # self.lay.addWidget(spacer) 

        self.lay.addWidget(self.iconLabel)
        self.lay.addWidget(self.titleLabel)
        self.lay.addWidget(self.minButton)
        self.lay.addWidget(self.restoreButton)
        self.lay.addWidget(self.closeButton)

        # default_style = self.minButton.styleSheet()
        default_style_name = QStyleFactory.keys()[0]  # 假设 QPushButton 使用第一个样式
  
        # # 打印按钮的默认样式表
        # print("打印样式表")
        # # print(str(default_style))
        # print(f'Default style name for QPushButton: {default_style_name}')
    def ShowMininizedWindow(self):
        self.win.showMinimized()

    def ShowMaximizedWindow(self):
        self.win.showMaximized()

    def ShowRestoreWindow(self):
        if self.win.isMaximized():
            self.win.showNormal()
        else:
            self.win.showMaximized()

    def CloseWindow(self):
        self.win.close()

    def SetTitle(self, str):
        self.titleLabel.setText(str)

    def SetIcon(self, pix):
        self.iconLabel.setPixmap(pix.scaled(self.iconLabel.size() - QSize(TITLE_ICON_MAG, TITLE_ICON_MAG)))

    def mouseDoubleClickEvent(self, event):
        self.ShowRestoreWindow()
        return QWidget().mouseDoubleClickEvent(event)

    def mousePressEvent(self, event):
        self.isPressed = True
        self.startPos = event.globalPos()
        return QWidget().mousePressEvent(event)

    def mouseReleaseEvent(self, event):
        self.isPressed = False
        return QWidget().mouseReleaseEvent(event)

    def mouseMoveEvent(self, event):
        if self.isPressed:
            if self.win.isMaximized:
                self.win.showNormal()

            movePos = event.globalPos() - self.startPos
            self.startPos = event.globalPos()
            self.win.move(self.win.pos() + movePos)

        return QWidget().mouseMoveEvent(event)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = TitleBar(None)
    win.show()
    sys.exit(app.exec_())
    pass

写着写着,发现运行效果有点怪,右边的按钮莫名其妙多出来一个蓝色的圆框,

image.png

找半天找不到是什么原因,qss也改过,我注释掉minButton,他这个蓝色框又会出现在中间的"还原"按钮上,如此类推,

当我把代码拷贝到别处运行,却是

image.png

完全没有这个蓝色框!

我排查了好久好久好久之后,发现,我把焦点注释了之后!

就是加上这样一个代码

self.minButton.setFocusPolicy(Qt.NoFocus)

他蓝框没了!没了!

image.png

不过跑到旁边去了,我把三个按钮全都加上之后

三个蓝框总算是消失了,
image.png

到底是为什么?为什么会这样???

还有顺便问一下,为什么我没设置圆角,按钮也变成圆角了?另外一份同样的代码完全没有这样的.

是因为默认有不同的样式吗? 是因为chameleon等等一些基础样式导致的吗?

但是我打印出来的基础样式只有两个啊

Windows
Fusion,

两个都不是这样的情况.


关键是只有在vscode里面F5运行调试的时候才会这样,打包成可执行程序完全没有这个框!

回复 收藏 只看作者
所有回复
把一切操作变成GUI
deepin
生态共建组骨干
发表于 2024-08-24 01:26
沙发

哪怕是dtk的按钮,默认也不应该带焦点才对啊???

回复 只看作者
pgxppp
deepin
发表于 2024-08-24 10:53
板凳

你自己都说了是vscode的问题

回复 只看作者
把一切操作变成GUI
deepin
生态共建组骨干
发表于 2024-08-24 11:22
地板
pgxppp

你自己都说了是vscode的问题

我的意思是“只有在运行或者调试的时候才会这样,打包成可执行程序完全没有这个框!“

同样的vscode,在另外一份一模一样的代码完全不会这样有蓝框。

回复 只看作者