pyqt5的一些琐碎但是有用的技巧/坑

1.圆角设置

基本所有组件都可以直接用以下代码实现功能,其中15px是圆角的半径

XXX.setStyleSheet("border-radius: 15px;")

2.自定义样式

理论上来说这个可以应用在所有组件,但是我觉得主要还是pushbutton用的比较多,所以展示一下pushbutton的

self.pushButton.setStyleSheet("""
QPushButton
{
width: 100%;
padding: 15px;
margin-bottom: 15px;
background: qlineargradient(
x1: 0, y1: 0, x2: 1, y2: 1,
stop: 0 #4169e1, stop: 1 #AAAAFF);
border: none;
color: white;
font-family: 'SimHei'; /* 黑体字体 */
font-size: 19px;
cursor: pointer;
transition: background 0.3s, transform 0.3s;
border-radius: 5px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
}
QPushButton:hover
{
background: qlineargradient(
x1: 0, y1: 0, x2: 1, y2: 1,
stop: 0 #6A6AFF, stop: 1 #A6FFFF);
}
}
""")

其实没有什么太重要的,但是上述代码中的background: qlineargradient是可以设置按钮渐变的,第一行的各种x和y是设置渐变的方向角度的,第二行是设置渐变的颜色和顺序,可以根据自己的需要进行调节,使用的颜色编码格式是十六进制,RGB应该也可以但是不太美观

QPushButton:hover则是当光标位于按钮上时按钮会进行的更新,我这个代码里写的就是当光标位于按钮上方时,按钮变色,即变成下面的样子

3.无边框设置

Juban.setWindowFlags(Qt.FramelessWindowHint)  # 无边框
Juban.setAttribute(Qt.WA_TranslucentBackground, True)
Juban.setStyleSheet("border-radius: 15px;")

把Juban换成你的窗口的名字,前两行就是设置无边框了,第三行是设置一个圆角,让界面美观一点

但是请注意如果界面中的包括frame或者widget之类的各种组件没有自定义样式即使用的是默认样式的话,这些组件都会被隐藏,你的界面就只有一小坨东西了,所以建议在界面里先放一个大frame或者widget然后整个白色背景啥的,这样就能避免这种问题发生

但是这样的话上面所有的组件会继承变成白色,这个时候就需要你耐心慢慢设置了

4.无边框窗口拖动

没有边框该怎么拖动窗口呢,这时候就需要额外添加代码实现功能

以下代码写入setup处
self.offset = QPoint()

以下代码写入指令执行区
def mousePressEvent(self, event):
    if event.button() == Qt.LeftButton:
        # 检查鼠标点击是否在self.widget内
        if self.widget.geometry().contains(event.pos()):
            self.offset = event.globalPos() - self.frameGeometry().topLeft()
            event.accept()
def mouseMoveEvent(self, event):
    if event.buttons() == Qt.LeftButton:
        # 检查鼠标是否在self.widget内按下并移动
        if self.widget.geometry().contains(event.pos()):
            self.move(event.globalPos() - self.offset)
            event.accept()
def mouseReleaseEvent(self, event):
    if event.button() == Qt.LeftButton:
        event.accept()

5.多窗口组件如按钮失效

这个是一个很容易踩的坑,一般是从主窗口条状到另一个窗口后点击各种组件都没有反应也不报错,这是因为它只调用了布局代码而没有调用相应的指令代码,这个时候可以按照以下步聚来整

其中class Ui_Juban(object)就直接放最基础的ui各种布局就好,然后编写指令区并在class头项中指向前面的Ui部分,把你需要的各种组件功能写在这里面。、

假如你需要生成新的窗口,按照相同的方式编写另一个ui和指令区后用下述代码就可以实现跳转指令(虽然你只指向了指令区,但是指令区中有一个连接ui的setup,所以此时功能和布局都会正常工作),第一行是指向,第二行是隐藏当前窗口(随你删除),第三行是显示子窗口

6.多窗口数据互联

前面介绍了其他窗口的调用,但是这也只是可以调用,你没法进行实际的互联,如果你在class first强行用second.xxx来调用second的某项数据或者功能那大概率是会报错的(我的是这样)

此时一种解决方法是将两者进行父子连接设置,具体需要添加的代码如下

首先是下面这一个,把原本调用子窗口的指令改成这个(没加hide,你想加随你)

def getready(self):
    self.aaa = minifirst(parent=self)  # Pass the instance of 'first' as parent
    self.aaa.show()

然后修改子窗口的指令区部分内容,后面就继续像前面说的添加你原本想添加的指令就好,此时两个窗口就已经互联了

class minifirst(QMainWindow, Ui_xuanfu):
    def __init__(self,parent=None):
        super().__init__()
        self.setupUi(self)
        self.parent = parent

如果你想通过子窗口的某个部件控制主窗口可以通过下面的指令

self.parent.loading1()

其中self.parent就是指向父系,loading1就是父系即主窗口的某个指令

7.组件可视化

假如你有两三种选项,每种选项又有两三种子选项,把这些所有选项全部罗列出来确实不美观,此时就可以设置当选中某个选项的时候则显示特定子选项隐藏其他子选项

首先使用下面两个任意一种触发方式指引到可视化指令部分,toggled和clicked的区别不是很明显,用的时候不需要太纠结,我的理解是,toggled判断当前组件的状态,如radiobutton是否处于被选中的状态,而clicked是检测动作,检测当前组件是否被点击,所以其实还好,基本都能实现功能

self.pqnor.toggled.connect(self.pqchange)
self.pqnor.clicked.connect(self.pqchange)

然后用下面的就可以实现隐藏或者不隐藏,比较人性化的是,他隐藏之后剩下可视化的东西会自动对齐,不会突然空空的一块,还挺好

def pqchange(self):
    if self.pqdiy.isChecked():
        self.widget_15.setVisible(True)
    elif self.pqnor.isChecked():
        self.widget_15.setVisible(False)

或者你可以使用下面代码设置widget或者frame或者groupbox之类的不接受任何指令,不接受之后那一部分会变灰色无法选中,也是一种解决方法

self.groupBox_2.blockSignals(True)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值