setEnabled(bool)
:该函数用于设置QWidget控件的可用性,参数bool为True表示该控件为可用状态,False表示该控件为不可用状态。当控件处于不可用状态时,该控件将无法响应用户的交互事件。
isEnabled()
:该函数用于获取QWidget控件的当前可用状态,返回值为一个bool类型,True表示该控件为可用状态,False 表示该控件为不可用状态。
以下为代码示例:
from PyQt5.QtWidgets import *
import sys
app = QApplication(sys.argv)
window = QWidget()
window.resize(300, 300)
btn = QPushButton(window)
btn.setText('按钮')
# 设置按钮为不可用
btn.setEnabled(False)
print(btn.isEnabled()) # 获取当前按钮是否可用的状态,并打印出来
window.show()
sys.exit(app.exec_())
运行结果:
观察一下打印结果,按钮设置为不可用之后会颜色会变暗,且不能被点击。
setVisible(bool)
(或setHidden(bool)
):这个函数用于设置QWidget控件的可见状态。当参数bool为True时,控件将会显示出来;当参数bool为False时,控件将会隐藏起来。
show()
:这个函数将会显示QWidget控件。相当于调用setVisible(True)
。
hide()
:这个函数将会隐藏QWidget控件。相当于调用setVisible(False)
。
isHidden()
:这个函数返回一个bool值,表示当前QWidget控件是否处于隐藏状态。如果返回值为True,表示控件被隐藏;如果返回值为False,表示控件可见。
isVisible()
:这个函数返回一个bool值,表示当前QWidget控件是否处于可见状态。如果返回值为True,表示控件可见;如果返回值为False,表示控件隐藏。
isVisibleTo(widget)
:这个函数用于检查QWidget控件是否对另一个特定的widget可见。(父控件显示的时候,子控件是否会跟着显示)它接受一个widget作为参数,返回一个bool值表示控件是否对该widget可见。
注意:
以下为代码示例:
from PyQt5.QtWidgets import *
import sys
class Window(QWidget):
# 重写绘制事件
def paintEvent(self, QPaintEvent):
print('窗口被绘制')
return super().paintEvent(QPaintEvent)
class Btu(QPushButton):
# 重写绘制事件
def paintEvent(self, QPaintEvent):
print('按钮被绘制')
return super().paintEvent(QPaintEvent)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = Window()
window.resize(300, 300)
btu = Btu(window)
btu.setText('按钮')
btu.setVisible(False)
# 打印父控件如果显示的时候,子控件是否跟着被显示
print(btu.isVisibleTo(window))
window.show()
sys.exit(app.exec_())
运行结果:
可以看到按钮已经被隐藏
设置窗口标题xxx[*]
setWindowModified(bool)
:这个函数用于设置QWidget控件的编辑状态。当参数bool为True时,控件将会被视为已编辑;当参数bool为False时,控件将不再被视为已编辑。
isWindowModified()
:这个函数返回一个bool值,表示当前QWidget控件是否处于编辑状态。如果返回值为True,表示控件已经被编辑过;如果返回值为False,表示控件未被编辑。
代码示例:
from PyQt5.QtWidgets import *
import sys
app = QApplication(sys.argv)
window = QWidget()
window.setWindowTitle('[*]交互状态')
window.resize(300, 300)
window.setWindowModified(True) # 设置窗口可编辑状态
print(window.isWindowModified())
window.show()
sys.exit(app.exec_())
运行结果:
活跃窗口是用户当前正在与之交互的窗口,例如正在编辑文本、接收键盘输入或执行操作。
isActiveWindow()
: 这个函数用于检查QWidget控件是否为活跃窗口。如果控件是当前应用程序激活的窗口,即接收键盘和鼠标事件的窗口,则函数返回True;否则返回False。
代码示例:
from PyQt5.QtWidgets import *
import sys
app = QApplication(sys.argv)
w1 = QWidget()
w1.resize(300, 300)
w1.setWindowTitle('w1')
w2 = QWidget()
w2.resize(400, 200)
w2.setWindowTitle('w2')
w1.show()
w2.show()
w1.raise_() # 将w1窗口设为顶层窗口
print(w1.isActiveWindow()) # 打印w1是否为活跃窗口
print(w2.isActiveWindow()) # 打印w2是否为活跃窗口
sys.exit(app.exec_())
运行结果:
从下图中我们看到,即使使用了raise_()
将w1窗口设置为顶层窗口,但是w1却不是活跃窗口(标题栏为灰色)。
close()
:这个函数用于关闭QWidget控件,使其不可见。调用该函数时会触发 closeEvent()
函数,您可以在该函数中执行额外的操作,例如先隐藏控件,等待异步操作完成后再关闭。
setAttribute(Qt.WA_DeleteOnClose, True)
:这个函数就是告诉 PyQt 在控件关闭后将其删除。由于控件在关闭时不会自动删除,因此需要在退出函数closeEvent()
中调用 deleteLater()
函数或手动删除控件。
代码示例:
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt
import sys
app = QApplication(sys.argv)
window = QWidget()
window.resize(300, 300)
btn = QPushButton(window)
btn.setText('按钮')
btn.destroyed.connect(lambda: print('按钮被销毁')) # 绑定销毁事件,若按钮被销毁则打印“按钮被销毁”
#### 测试代码区 ####
#### 测试代码区 ####
window.show()
sys.exit(app.exec_())
下面将再测试代码区中编写测试API的代码:
btn.close()
print(btn.isHidden())
运行结果:
按钮已被隐藏,控制台输出True,按钮被隐藏而没有被释放。
btn.setAttribute(Qt.WA_DeleteOnClose, True)
btn.close()
运行结果:
案例:创建一个窗口,包含一个文本框和一个按钮以及一个标签。
要求:
涉及知识点:
QLineEdit
类textChanged
信号text()
方法综合案例的代码:
from PyQt5.QtWidgets import *
import sys
class Window(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.setWindowTitle("综合案例")
self.resize(300, 300)
self.setup_ui()
def setup_ui(self):
self.label = QLabel(self)
self.label.setStyleSheet('background-color: cyan;')
self.label.move(100, 50)
self.label.hide()
self.lineEdit = QLineEdit(self)
self.lineEdit.move(100, 100)
self.lineEdit.textChanged.connect(self._textChanged) # 文本框文本改变事件绑定
self.btu = QPushButton(self)
self.btu.setText('按钮')
self.btu.move(100, 150)
self.btu.setEnabled(False)
self.btu.pressed.connect(self._btuPressed)
def _textChanged(self):
self.label.show()
self.label.setText('登录')
self.label.adjustSize()
if len(self.lineEdit.text()) > 0:
self.btu.setEnabled(True)
else:
self.label.hide()
def _btuPressed(self):
self.label.show()
if self.lineEdit.text() == 'PyQt5':
self.label.setText('登录成功')
else:
self.label.setText('登录失败')
self.label.adjustSize() # 将标签设置为自适应
if __name__ == '__main__':
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
运行结果:
statusTip()
函数:
tooltip = button.statusTip()
setStatusTip(str)
函数:
button.setStatusTip('Press this button to do something cool!')
示例代码:
from PyQt5.QtWidgets import *
import sys
app = QApplication(sys.argv)
window = QMainWindow() # 懒加载,用到的时候才会创建
window.setWindowTitle('信息案例')
window.resize(300, 300)
window.statusBar() # 设置状态栏
window.setStatusTip('这是一个窗口') # 设置状态栏提示信息
window.show()
sys.exit(app.exec_())
运行结果:
在以上代码中使用QMainWindow()
是因为它是PyQt中提供的一个主窗口类,适用于创建带有菜单栏、工具栏、状态栏和中央部件的应用程序窗口。
toolTip()
函数:
tooltip = button.toolTip()
setToolTip(str)
函数:
button.setToolTip('This is a button')
工具提示持续时间:
toolTipDuration()
函数:
duration = QToolTip.toolTipDuration()
setToolTipDuration(msec)
函数:
QToolTip.setToolTipDuration(5000)
示例代码:
from PyQt5.QtWidgets import *
import sys
app = QApplication(sys.argv)
window = QMainWindow()
window.setWindowTitle('信息案例')
window.resize(300, 300)
label = QLabel(window)
label.setText('标签')
label.setToolTip('这是一个标签') # 设置标签工具提示信息
print(label.toolTip()) # 打印工具提示信息
label.setToolTipDuration(2000) # 设置标签工具提示信息为2秒
print(label.toolTipDuration()) # 打印工具提示信息的时间
window.show()
sys.exit(app.exec_())
运行结果:
whatsThis()
函数:
wts = button.whatsThis()
setWhatsThis(str)
函数:
button.setWhatsThis('This is a button')
示例代码:
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt
import sys
app = QApplication(sys.argv)
window = QMainWindow()
window.setWindowTitle('信息案例')
window.resize(300, 300)
window.setWindowFlags(Qt.WindowContextHelpButtonHint)
label = QLabel(window)
label.setText('标签')
label.adjustSize()
label.setWhatsThis('这是什么标签')
print(label.whatsThis()) # 打印“这是什么”提示信息
window.show()
sys.exit(app.exec_())
运行结果:
点击窗口标题栏中的“?
”,将鼠标移动到标签并点击,点击后即出现“这是什么”提示信息。
以上代码中使用了 window.setWindowFlags(Qt.WindowContextHelpButtonHint)
这行代码来设置窗口标志,其作用是在窗口的标题栏右侧添加一个帮助按钮,也就是包含一个问号图标并显示"What’s This"文本的帮助按钮,用于提供更多的上下文相关帮助信息。
在 PyQt 中,焦点控制是指应用程序中各个控件接收焦点的方式和顺序。焦点控制允许用户使用键盘或鼠标与特定控件进行交互。下面是一些在 PyQt 中实现焦点控制的方法和技术。
setFocus()
函数:
widget.setFocus()
setFocusPolicy(Policy)
函数:
Qt.TabFocus
:通过 Tab 键进行切换焦点。Qt.ClickFocus
:通过点击鼠标进行设置焦点。Qt.StrongFocus
:允许通过 Tab 键和点击鼠标进行焦点设置。Qt.NoFocus
:控件不接收焦点。widget.setFocusPolicy(Qt.TabFocus)
clearFocus()
函数:
widget.clearFocus()
示例代码:
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt
import sys
app = QApplication(sys.argv)
window = QWidget()
window.setWindowTitle('焦点控制')
window.resize(300, 300)
le1 = QLineEdit(window)
le1.move(50, 50)
le2 = QLineEdit(window)
le2.move(50, 100)
le3 = QLineEdit(window)
le3.move(50, 150)
window.show()
sys.exit(app.exec_())
运行结果:
以上代码没有设置获取焦点的策略,默认情况下运行程序,第一个文本框会获得焦点,且按下Tab
键可切换焦点。
在以上代码的基础上设置le2
获取焦点的策略为通过Tab键获取焦点:
le2.setFocusPolicy(Qt.TabFocus)
运行结果:
鼠标点击le2
并不能获取到焦点,而点击le3
可获取到焦点,只有通过Tab键才能让le2
获取焦点。
focusWidget()
函数:
parent.focusWidget()
focusNextChild()
函数:
parent.focusNextChild()
focusPreviousChild()
函数:
parent.focusPreviousChild()
focusNextPrevChild(bool)
函数:
true
时,向下查找下一个子控件;当参数为 false
时,向上查找上一个子控件。parent.focusNextPrevChild(True)
setTabOrder(pre_widget, next_widget)
函数:
QWidget.setTabOrder(widget1, widget2)
示例1代码
from PyQt5.QtWidgets import *
import sys
class Window(QWidget):
def mousePressEvent(self, QPressEvent):
print('获取焦点的控件:', self.focusWidget())
if __name__ == '__main__':
app = QApplication(sys.argv)
window = Window()
window.resize(300, 300)
le1 = QLineEdit(window)
le1.move(50, 0)
print('le1对象:', le1)
le2 = QLineEdit(window)
le2.move(50, 50)
le3 = QLineEdit(window)
le3.move(50, 100)
window.show()
# 获取当前窗口内部,所有子控件当中获取焦点的那个控件
print(window.focusWidget())
sys.exit(app.exec_())
运行结果:
窗口显示时,焦点为None的原因:初始焦点未明确设置时,窗口显示时焦点会默认为None,也就是执行到window.show()
的时候所有子控件都没有获取到焦点,而往后继续执行的过程中,第一个子控件才获取到焦点。
示例2代码:
from PyQt5.QtWidgets import *
import sy
app = QApplication(sys.argv)
window = QWidget()
window.resize(300, 300)
le1 = QLineEdit(window)
le1.move(50, 0)
le2 = QLineEdit(window)
le2.move(50, 50)
le3 = QLineEdit(window)
le3.move(50, 100)
# 设置获取焦点规则
window.setTabOrder(le1, le3)
window.setTabOrder(le3, le2)
window.show()
sys.exit(app.exec_())
运行结果: