|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 qq1151985918 于 2022-10-1 18:19 编辑
第一个: (已解决请直接看第二个问题)
将隐藏(显示)窗口绑定到全局快捷键Alt + Z,可以正常使用,但是想要将隐藏窗口直接显示到(200, 200)就会崩溃,请教大佬到底什么原因?
第 63 行我注释掉了,如果加进去就会崩溃,求原因?怎样解决呢?
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'qwe.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(400, 300)
self.pushButton = QtWidgets.QPushButton(Form)
self.pushButton.setGeometry(QtCore.QRect(110, 110, 171, 61))
self.pushButton.setObjectName("pushButton")
self.pushButton_2 = QtWidgets.QPushButton(Form)
self.pushButton_2.setGeometry(QtCore.QRect(110, 200, 171, 61))
self.pushButton_2.setObjectName("pushButton_2")
self.label = QtWidgets.QLabel(Form)
self.label.setGeometry(QtCore.QRect(50, 20, 311, 71))
self.label.setTextFormat(QtCore.Qt.PlainText)
self.label.setScaledContents(False)
self.label.setWordWrap(True)
self.label.setObjectName("label")
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
self.pushButton.setText(_translate("Form", "隐藏(显示)窗口"))
self.pushButton_2.setText(_translate("Form", "移动到(200,200)"))
self.label.setText(_translate("Form", "将隐藏(显示)窗口绑定到全局快捷键Alt + Z,可以正常使用,但是想要将隐藏窗口直接显示到(200,200)就会崩溃,请教大佬到底什么原因?"))
import sys
from PyQt5.QtWidgets import QWidget, QApplication
from system_hotkey import SystemHotkey
class Window(Ui_Form, QWidget):
def __init__(self):
super().__init__()
self.setupUi(self)
self.hotkey = SystemHotkey() # 全局快捷键 Alt + Z
self.hotkey.register(('alt', 'z'), callback=self.hide_show)
self.pushButton.clicked.connect(self.hide_show)
self.pushButton_2.clicked.connect(lambda:self.move_x_y(200, 200))
self.show()
def hide_show(self, *arg):
if not self.isHidden():
self.hide()
else:
self.show()
## self.move(200, 200) # 加上这一行代码就会崩溃,求原因
def move_x_y(self, x=200, y=200):
self.move(x, y)
if __name__ == "__main__":
app = QApplication(sys.argv)
ui = Window()
sys.exit(app.exec_())
第二个
我前段时间提问过气泡弹窗和鼠标移动到 QLabel 显示气泡提醒的问题
但是这两个结合起来,气泡提示就会消失,求原因?是哪里冲突了吗?
# 当不点击按钮提示气泡的时候,鼠标移动到QLabel可以正常查看内容
# 但是点击按钮后就无法正常显示
# 详见案例
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'qwe.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QWidget, QApplication, QDialog
from PyQt5.QtCore import Qt, QTimer, QRect
from pyautogui import position
# 以下是我在网上找到的气泡显示提示
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(150, 54)
Dialog.setStyleSheet("background: transparent;")
self.pushButton = QtWidgets.QPushButton(Dialog)
self.pushButton.setGeometry(QtCore.QRect(0, 0, 151, 51))
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.pushButton.sizePolicy().hasHeightForWidth())
self.pushButton.setSizePolicy(sizePolicy)
font = QtGui.QFont()
font.setFamily("Microsoft YaHei UI")
font.setPointSize(10)
font.setBold(True)
font.setWeight(75)
self.pushButton.setFont(font)
self.pushButton.setFocusPolicy(QtCore.Qt.NoFocus)
self.pushButton.setContextMenuPolicy(QtCore.Qt.NoContextMenu)
self.pushButton.setAutoFillBackground(False)
# 在这里设置气泡的stylesheet
self.pushButton.setStyleSheet("background-color:lightgreen;\n"
"border-style:none;\n"
"padding:8px;\n"
"border-radius:25px;")
self.pushButton.setObjectName("pushButton")
self.retranslateUi(Dialog)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate
Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
self.pushButton.setText(_translate("Dialog", "提示框"))
# 创建静态变量的装饰器
def static_vars(**kwargs):
def decorate(func):
for k in kwargs:
setattr(func, k, kwargs[k])
return func
return decorate
class TipUi(QDialog):
def __init__(self, text:str, parent=None):
# 设置ui
super().__init__(parent)
self.ui = Ui_Dialog()
self.ui.setupUi(self)
# 设置定时器,用于动态调节窗口透明度
self.timer = QTimer()
# 设置气泡在屏幕上的位置,水平居中,垂直屏幕80%位置
desktop = QApplication.desktop()
x, y = position()
self.setGeometry(QRect(int(x), int(y), 152, 50))
# 显示的文本
self.ui.pushButton.setText(text)
# 设置隐藏标题栏、无边框、隐藏任务栏图标、始终置顶
self.setWindowFlags(Qt.CustomizeWindowHint | Qt.FramelessWindowHint | Qt.Tool | Qt.WindowStaysOnTopHint)
# 设置窗口透明背景
self.setAttribute(Qt.WA_TranslucentBackground, True)
# 窗口关闭自动退出,一定要加,否则无法退出
self.setAttribute(Qt.WA_QuitOnClose, True)
# 用来计数的参数
self.windosAlpha = 0
# 设置定时器25ms,1600ms记64个数
self.timer.timeout.connect(self.hide_windows)
self.timer.start(25)
# 槽函数
def hide_windows(self):
self.timer.start(25)
# 前750ms设置透明度不变,后850ms透明度线性变化
if self.windosAlpha <= 30:
self.setWindowOpacity(1.0)
else:
self.setWindowOpacity(1.882 - 0.0294 * self.windosAlpha)
self.windosAlpha += 1
# 差不多3秒自动退出
if self.windosAlpha >= 63:
self.close()
# 静态方法创建气泡提示
@staticmethod
@static_vars(tip=None)
def show_tip(text):
TipUi.show_tip.tip = TipUi(text)
TipUi.show_tip.tip.show()
# 当不点击按钮提示气泡的时候,鼠标移动到QLabel可以正常查看内容
# 但是点击按钮后就无法正常显示
# 详见案例
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(400, 300)
self.pushButton = QtWidgets.QPushButton(Form)
self.pushButton.setGeometry(QtCore.QRect(110, 150, 171, 61))
self.pushButton.setObjectName("pushButton")
self.label = QtWidgets.QLabel(Form)
self.label.setGeometry(QtCore.QRect(50, 40, 311, 71))
self.label.setTextFormat(QtCore.Qt.PlainText)
self.label.setScaledContents(False)
self.label.setWordWrap(True)
self.label.setObjectName("label")
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
self.pushButton.setText(_translate("Form", "显示气泡提醒"))
tip_text = "我前段时间提问过气泡弹窗和鼠标移动到 QLabel 显示气泡提醒的问题,但是这两个结合起来,气泡提示就会消失,求原因?是哪里冲突了吗?"
self.label.setText(_translate("Form", tip_text))
self.label.setToolTip(tip_text)
class Window(Ui_Form, QWidget):
def __init__(self):
super().__init__()
self.setupUi(self)
self.pushButton.clicked.connect(self.show_tips)
self.show()
def show_tips(self):
TipUi.show_tip('显示气泡提醒')
# 当点击按钮后,鼠标再移动到QLabel就不再显示tip
if __name__ == "__main__":
app = QApplication(sys.argv)
ui = Window()
sys.exit(app.exec_())
本帖最后由 阿奇_o 于 2022-10-1 17:41 编辑
问题1: 因为"事件循环"机制, self.hide() 和 self.show() 以及 self.move() 会根据你定义的触发条件(被你定义在hide_show方法里了),一直LOOP执行着!即页面按特定帧率刷新着。
也就是说,是因为 self.pushButton.clicked.connect(self.hide_show) 这句导致一旦被触发就一直LOOP,self.move(200, 200)被一直重复最后导致程序崩溃。
解决:注释掉上面说的这一行。 只用 hotkey 即可,因为它是 callback function 只会执行一次。
或者改用其他非connect的、合适的toggle的方法(暂时我也没找到)
另外,如果你理解了的话,move_x_y 这个方法,也就没必要定义。 因为 移动的按钮 可以直接用PyQt组件自己的move方法,即 ...connect(lambda :self.move(200,200))
|
|