3-QObject对象介绍

QObject

from PySide6.QtCore import QObject

QObject是所有的Qt对象的基类,所有的对象都是直接或者间接的继承自QObject

官方说明

QObject是Qt对象模型的核心。该模型的核心特征是一种非常强大的无缝对象通信机制,称为信号和插槽。您可以使用connect将信号连接到插槽,并使用disconnect破坏连接。为了避免永不结束的通知循环,您可以使用blockSignals临时阻止信号。受保护的函数connectNotify和disconnectNotify。

QObjects在对象树中组织自己。当您创建一个以另一个对象为父对象的QObject时,该对象将自动将自己添加到父对象的children列表中。父对象拥有对象的所有权;即它将自动删除其析构函数中的子函数。您可以按名称查找对象,也可以选择使用findChild或findChildren进行键入。

每个对象都有一个objectName,其类名可以通过相应的metaObject找到请参见className。您可以使用inherits函数来确定对象的类是否继承了QObject继承层次结构中的另一个类。

当一个对象被删除时,它会发出destroyed信号。您可以捕捉这个信号,以避免挂起对QObjects的引用。

QObjects可以通过event接收事件,并过滤其他对象的事件。有关详细信息,请参阅installEventFilter和eventFilter。可以重新实现一个便利处理程序childEvent来捕获子事件。

最后但同样重要的是,QObject在Qt中提供了基本的定时器支持;有关定时器的高级支持,请参阅QTimer。

请注意,Q_OBJECT宏对于实现信号、插槽或财产的任何对象都是必需的。您还需要对源文件运行元对象编译器。我们强烈建议在QObject的所有子类中使用此宏,无论它们是否实际使用信号、插槽和财产,因为如果不这样做,可能会导致某些函数表现出奇怪的行为。

所有Qt小部件都继承QObject。方便函数isWidgetType返回一个对象是否实际上是一个小部件。它比qobject_cast<QWidget*>obj或obj->继承"QWidget"快得多。

一些QObject函数,例如children,会返回一个QObjectList。QObjectList是QList<QObject*>的typedef。

线程相关性

QObject实例被称为具有线程亲和性,或者它位于某个线程中。当QObject接收到排队的信号或发布的事件时,槽或事件处理程序将在对象所在的线程中运行。

如果一个QObject没有线程相关性也就是说,如果thread返回零,或者它所在的线程没有正在运行的事件循环,那么它就无法接收排队的信号或发布的事件。

默认情况下,一个QObject位于创建它的线程中。对象的线程相关性可以使用thread查询,也可以使用moveToThread更改。

所有QObjects必须与其父对象位于同一线程中。因此:

  • 如果涉及的两个QObject位于不同的线程中,则setParent将失败。
  • 当一个QObject被移动到另一个线程时,它的所有子线程也将被自动移动。
  • 如果QObject有一个父对象,那么moveToThread将失败。
  • 如果QObjects是在run中创建的,那么它们就不能成为QThread对象的子对象,因为QThread不存在于调用run的线程中。

QObject的成员变量不会自动成为它的子对象。必须通过传递指向子构造函数的指针或调用setParent来设置父子关系。如果没有这一步骤,当调用moveToThread时,对象的成员变量将保留在旧线程中。

无复制构造函数或赋值运算符#

QObject既没有复制构造函数,也没有赋值运算符。这是经过设计的。实际上,它们是声明的,但在一个带有宏Q_DISABLE_COPY的私有部分中。事实上,所有从QObject派生的Qt类直接或间接都使用这个宏来声明它们的复制构造函数和赋值运算符是私有的。推理可以在Qt对象模型页面上关于身份与价值的讨论中找到。

主要的结果是,您应该使用指向QObject或指向您的QObject子类的指针,否则您可能会想使用您的QOObject子类作为值。例如,如果没有复制构造函数,就不能使用QObject的子类作为要存储在其中一个容器类中的值。您必须存储指针。

自动连接

Qt的元对象系统提供了一种机制,可以自动连接QObject子类及其子类之间的信号和插槽。只要用合适的对象名称定义对象,并且插槽遵循简单的命名约定,则可以在运行时通过connectSlotsByName函数执行此连接。

uic生成调用此函数的代码,以便在使用Qt Designer创建的表单上的小部件之间执行自动连接。有关使用Qt Designer自动连接的更多信息,请参阅Qt Designer手册的"在应用程序中使用设计器UI文件"部分。

动态属性

在Qt4.2中,动态财产可以在运行时添加到QObject实例中,也可以从中删除。动态财产不需要在编译时声明,但它们提供了与静态财产相同的优点,并使用相同的API进行操作—使用property读取它们,使用setProperty写入它们。

从Qt4.3开始,QtDesigner支持动态财产,并且可以为标准Qt小部件和用户创建的表单提供动态财产。

国际化(I18n)

所有QObject子类都支持Qt的翻译功能,从而可以将应用程序的用户界面翻译成不同的语言。

为了使用户可见的文本可翻译,必须将其封装在对tr函数的调用中。这在为翻译编写源代码文档中有详细解释。

属性

PySide6.QtCore.QObject.objectName: str

此属性包含此对象的名称。
您可以使用findChild()按名称(和类型)查找对象。您可以使用findChildren()找到一组对象。

qDebug("MyClass.setPrecision():(%s)invalid precision %f",
       qPrintable(objectName()),newPrecision)

默认情况下,此属性包含一个空字符串。

访问功能:

  • objectName()
  • setObjectName(name)
  • Signal objectNameChanged(objectName)

方法

  • PySide6.QtCore.Qt.ConnectionType

    此枚举描述了可以在信号和插槽之间使用的连接类型。特别地,它确定特定信号是立即传送到时隙还是排队等待稍后传送。

    Constant Description
    Qt.AutoConnection (默认值)如果接收器位于发出信号的线程中,则使用Qt::DirectConnection。否则,将使用Qt::QueuedConnection。连接类型是在发出信号时确定的。
    Qt.DirectConnection 当信号发出时,会立即调用插槽。插槽在信令线程中执行。
    Qt.QueuedConnection 当控制返回到接收器线程的事件循环时,将调用slot。插槽在接收器的线程中执行。
    Qt.BlockingQueuedConnection 与Qt::QueuedConnection相同,只是信号线程会阻塞直到插槽返回。如果接收器位于信令线程中,则不得使用此连接,否则应用程序将死锁。
    Qt.UniqueConnection 这是一个标志,可以使用逐位OR与上述任何一种连接类型组合。当设置Qt::UniqueConnection时,如果连接已经存在(即,如果同一信号已经连接到同一对对象的同一插槽),connect()将失败。此标志在问题4.6中引入。
    Qt.SingleShotConnection 这是一个标志,可以使用逐位OR与上述任何一种连接类型组合。当设置Qt::SingleShotConnection时,插槽将只被调用一次;当信号发出时,连接将自动断开。此标志是在Qt 6.0中引入的。

    对于排队连接,参数必须是Qt的元对象系统已知的类型,因为Qt需要复制参数以将其存储在幕后事件中。如果您尝试使用排队连接并得到错误消息:

    QObject::connect: Cannot queue arguments of type'MyType'
    

    在建立连接之前,调用qRegisterMetaType()来注册数据类型。
    将信号和插槽与多个线程一起使用时,请参阅跨线程的信号和插槽。

总览

方法 说明
blockSignals(b:bool)->bool 如果block为true,则该对象发出的信号将被阻塞(即,发出信号将不会调用与其连接的任何东西)。如果block为false,则不会发生此类阻塞。
返回值是signalsBlocked()的上一个值。
请注意,即使此对象的信号已被阻止,destroyed()信号也会发出。
被阻塞时发出的信号不会被缓冲。
children()->list() 返回子对象的列表。QObjectList类在头文件中定义如下:
添加的第一个子对象是列表中的第一个对象,添加的最后一个子对象是该列表中的最后一个对象,即新的子对象被附加在末尾。
请注意,当QWidget子项升高或降低时,列表顺序会发生变化。上升的小部件成为列表中的最后一个对象,下降的小部件变成列表中的第一个对象。
dumpObjectInfo() 将有关此对象的信号连接等的信息转储到调试输出。
dumpObjectTree() 将子级树转储到调试输出。
dynamicPropertyNames() 返回使用setProperty()动态添加到对象中的所有财产的名称。
emit(arg__1:str,arg__2:any)->bool 发送信号
findChild(type:PyTypeObject[,name:str={}[,options:FindChildOptions=Qt.FindChildrenRecursively]])->object 要查找某个QObject的子对象,此函数的第一个参数应该是子对象的类型,第二个参数应该为子对象的名称:
parent = QWidget()
# The first argument must be the child type
child1 = parent.findChild(QPushButton,“child_button”)
child2 = parent.findChild(QWidget,“child_widget”)
findChildren(type:PyTypeObject[,name:str={}[,options:FindChildOptions=Qt.FindChildrenRecursively]])->PySequence 与findChild方法一样,第一个参数应该是子对象的类型。
findChildren(type:PyTypeObject,pattern:PySide6.QtCore.QRegularExpression[,options:FindChildOptions=Qt.FindChildrenRecursively])->PySequence
inherits(classname:str)->bool 如果此对象是继承className的类的实例,或是继承className的QObject子类,则返回true;否则返回false。
类被认为是继承了它自己。
installEventFilter(filterObj:PySide6.QtCore.QObject) 在此对象上安装事件筛选器filterObj。详细介绍见后面
isQuickItemType()->bool 如果对象是QQuickItem,则返回true;否则返回false。
调用此函数相当于调用inherits(“QQuickItem”),只是速度要快得多。
isSignalConnected(signal:PySide6.QtCore.QMetaMethod)->bool 如果信号连接到至少一个接收器,则返回true,否则返回false。
signal必须是该对象的信号成员,否则行为是未定义的。
isWidgetType()->bool 如果对象是小部件,则返回true;否则返回false。
调用这个函数相当于调用inherits(“QWidget”),只是速度要快得多。
isWindowType()->bool 如果对象是一个窗口,则返回true;否则返回false。
调用这个函数相当于调用inherits(“QWindow”),只是速度要快得多。
killTimer(id:int) 使用计时器标识符id杀死计时器。
计时器事件启动时,startTimer()会返回计时器标识符。
moveToThread(thread:PySide6.QtCore.QThread) 更改此对象及其子对象的线程相关性。如果对象有父对象,则无法移动该对象。事件处理将在targetThread中继续。
要将对象移动到主线程,请使用instance()检索指向当前应用程序的指针,然后使用thread()检索应用程序所在的线程。例如:
myObject.moveToThread(QApplication.instance().thread())

如果targetThread为None,则此对象及其子对象的所有事件处理都将停止,因为它们不再与任何线程关联。
请注意,该对象的所有活动计时器都将重置。计时器首先在当前线程中停止,然后在targetThread中重新启动(间隔相同)。因此,在线程之间不断移动对象可以无限期地推迟计时器事件。
线程相关性更改之前,ThreadChange事件会发送到此对象。您可以处理此事件以执行任何特殊处理。请注意,发布到此对象的任何新事件都将在targetThread中处理,前提是它不是None:如果它是None,则无法对此对象或其子对象进行任何事件处理,因为它们不再与任何线程关联。
objectName()->str 获取对象的属性objectName
parent()->PySide6.QtCore.QObject 返回指向父对象的指针。
property(name:str)->object 返回对象的name属性的值。
如果不存在此类属性,则返回的变体无效。
有关所有可用财产的信息通过metaObject()和dynamicPropertyNames()提供。
receivers(signal:str)->int 返回连接到信号的接收器数量。
由于时隙和信号都可以用作信号的接收器,并且可以多次进行相同的连接,因此接收器的数量与由该信号进行的连接的数量相同。
调用此函数时,可以使用SIGNAL()宏传递特定信号:
if receivers(SIGNAL(valueChanged(QByteArray)))> 0:
data = QByteArray()
get_the_value(data)# expensive operation
valueChanged.emit(data)
removeEventFilter(obj:PySide6.QtCore.QObject) 从此对象中删除事件筛选器对象obj。如果尚未安装此类事件筛选器,则会忽略该请求。
销毁此对象时,会自动删除此对象的所有事件筛选器。
删除事件过滤器总是安全的,即使在事件过滤器激活期间(即从eventFilter()函数中)也是如此。
sender()->PySide6.QtCore.QObject 如果在由信号激活的插槽中调用,则返回指向发送信号的对象的指针;否则返回None。指针仅在从该对象的线程上下文调用该函数的槽的执行期间有效。
如果发送器被破坏,或者插槽与发送器的信号断开连接,则此函数返回的指针将无效。
senderSignalIndex()->int 返回调用当前正在执行的slot的信号的元方法索引,该slot是sender()返回的类的成员。如果在由信号激活的插槽外调用,则返回-1。
对于具有默认参数的信号,无论connect()使用了哪个参数,此函数都将始终返回具有所有参数的索引。例如,被破坏的信号(QObject*obj=\nullptr)将有两个不同的索引(带参数和不带参数),但此函数将始终返回带参数的索引。当过载具有不同参数的信号时,这不适用。
setObjectName(name) 设置对象的ObjectName
setParent(parent) 设置对象的parent
setProperty(name:str,value:object)->bool 设置对象属性和值
将对象的名称特性name:str的值设置为value:object。
如果该属性是使用Q_property在类中定义的,那么成功时返回true,否则返回false。如果该属性不是使用Q_property定义的,因此没有在元对象中列出,则会将其添加为动态属性,并返回false。
有关所有可用财产的信息通过metaObject()和dynamicPropertyNames()提供。
可以使用property()再次查询动态财产,并且可以通过将属性值设置为无效的QVariant来删除。更改动态属性的值会导致向对象发送QDynamicPropertyChangeEvent。
signalsBlocked()->bool 如果信号被阻塞,则返回true;否则返回false。
默认情况下不会阻止信号。
startTimer(interval:int[,timerType:PySide6.QtCore.Qt.TimerType=Qt.CoarseTimer])->int 启动计时器并返回计时器标识符,如果无法启动计时器则返回零。
计时器事件将每隔几毫秒发生一次,直到调用killTimer()为止。如果间隔为0,那么每当没有更多窗口系统事件要处理时,计时器事件就会发生一次。
当计时器事件发生时,使用QTimerEvent事件参数类调用虚拟timerEvent()函数。重新实现此功能以获取计时器事件。
如果有多个计时器正在运行,则可以使用timerId()来查找激活的计时器。
thread()->PySide6.QtCore.QThread 返回对象所在的线程。
tr(sourceText:str[,disambiguation:str=None[,n=-1]])->str 官网无说明
childEvent(event) 可以在子类中重新实现此事件处理程序以接收子事件。事件在事件参数中传递。
添加或删除子对象时,ChildAdded和ChildRemoved事件会发送到对象。在这两种情况下,您只能依赖于子对象是QObject,或者如果isWidgetType()返回true,则可以依赖于QWidget。(这是因为,在ChildAdded的情况下,子项尚未完全构建,而在ChildRemoved的情况下它可能已经被销毁)。
当抛光子对象或添加抛光子对象时,ChildPolished事件会发送到小部件。如果您收到一个儿童抛光活动,则儿童的构建通常已完成。然而,这并不能保证,并且在执行小部件的构造函数期间可能会传递多个抛光事件。
对于每个子窗口小部件,您将收到一个ChildAdded事件、零个或多个ChildPolished事件以及一个ChildRemoved事件。
如果添加子项后立即删除该子项,则会忽略ChildPolished事件。如果在构建和销毁过程中对一个子级进行了多次抛光,那么您可能会收到同一个子代的多个子级抛光事件,每次都使用不同的虚拟表。
connectNotify(signal) 当某个东西已经连接到此对象中的信号时,就会调用此虚拟函数。
如果您想将信号与特定信号进行比较,可以使用fromSignal(),如下所示:
if signal == QMetaMethod.fromSignal(MyObject.valueChanged):
# signal is valueChanged
customEvent(event:PySide6.QtCore.QEvent) 此事件处理程序可以在子类中重新实现,以接收自定义事件。自定义事件是用户定义的事件,其类型值至少与type枚举的user项一样大,通常是QEvent子类。事件在事件参数中传递。
disconnectNotify(signal:PySide6.QtCore.QMetaMethod) 当某个东西与该对象中的信号断开连接时,会调用此虚拟函数。
有关如何将信号与特定信号进行比较的示例,请参见connectNotify()。
如果所有信号都与该对象断开连接(例如,disconnect()的信号参数为None),则disconnectNotify()只调用一次,并且该信号将是无效的QMetaMethod(isValidate()返回false)。
event(event:PySide6.QtCore.QEvent)->bool 这个虚拟函数接收对象的事件,如果事件e被识别和处理,则应该返回true。
可以重新实现event()函数来自定义对象的行为。
请确保为所有未处理的事件调用父事件类实现。
eventFilter(watched:PySide6.QtCore.QObject,event:PySide6.QtCore.QEvent) 如果此对象已作为监视对象的事件筛选器安装,则筛选事件。
在重新实现此函数时,如果您想过滤掉事件,即停止进一步处理,请返回true;否则返回false。
metaObject()->PySide6.QtCore.QMetaObject 返回指向此对象的元对象的指针。
元对象包含有关继承QObject的类的信息,例如类名、超类名、财产、信号和插槽。每个包含Q_OBJECT宏的QObject子类都将有一个元对象。
元对象信息是信号/时隙连接机制和属性系统所需要的。inherits()函数还使用了元对象。
如果您没有指向实际对象实例的指针,但仍想访问类的元对象,则可以使用staticMetaObject。
obj = QPushButton()
obj.metaObject().className()# returns"QPushButton"
QPushButton.staticMetaObject.className()# returns"QPushButton"
timerEvent(event:PySide6.QtCore.QTimerEvent) 可以在子类中重新实现此事件处理程序,以接收对象的计时器事件。
QTimer为定时器功能提供了更高级别的接口,还提供了有关定时器的更通用信息。计时器事件在事件参数中传递。
[slot]deleteLater() 计划删除此对象。
当控件返回到事件循环时,该对象将被删除。如果调用此函数时事件循环未运行(例如,在exec()之前对对象调用deleteLater()),则一旦事件循环启动,该对象将被删除。如果在主事件循环停止后调用deleteLater(),则不会删除该对象。由于Qt 4.8,如果deleteLater()是在一个没有运行事件循环的线程中的对象上调用的,那么当线程结束时,该对象将被销毁。
请注意,进入和离开新的事件循环(例如,通过打开模式对话框)将不会执行延迟删除;对于要删除的对象,控件必须返回调用deleteLater()的事件循环。这不适用于在上一个嵌套事件循环仍在运行时删除的对象:Qt事件循环将在新的嵌套事件循环开始时立即删除这些对象。

对象名称,属性

API

方法 说明
setObjectName(“唯一名称”) 给一个Qt对象设置一个名称``一般这个名称是唯一的,当做对象的ID来使用
objectName() 获取一个Qt对象的名称
setProperty(“属性名称”,值) 给一个Qt对象动态的添加一个属性与值
property(“属性名称”) 获取一个对象的属性值
dynamicPropertyNames() 获取一个对象中所有通过setProperty()设置的属性名称

应用场景

  • 用于qss的ID选择器,属性选择器,方便统一设置样式

    QObject.qss

    QLabel#notice {
        font-size: 20px;
        color: gray;
        border: 1px solid gray;
        border-radius: 8px;
    }
    QLabel#notice[notice_level="normal"]{
        color: green;
        border-color: green;
    }
    QLabel#notice[notice_level="warning"]{
        color: yellow;
        border-color: yellow;
    }
    QLabel#notice[notice_level="error"]{
        color: red;
        border-color: red;
    }
    
  • 用于装饰器的信号与槽

父子对象操作

API

方法 说明
setParent(parent) 设置父对象,父对象只能设置一个
parent() 获取父对象
children() 获取所有直接子对象,不包括间接的子对象如孙子辈的
findChild(参数1,参数2,参数3) 获取某一个指定名称和类型的子对象
参数1:QObject对象或者多个QObject对象元组
参数2:setProperty设置的属性名称,可以省略
参数3:查找选项,有两个可选
Qt.FindChildrenRecursively(递归查找,默认选项)
Qt.FindDirectChildrenOnly(只查找直接子对象)
inherits(classname)->bool 如果此对象是继承className的类的实例,或是继承className的QObject子类,则返回true;否则返回false。
类被认为是继承了它自己。

inherits例子:

timer = QTimer()# QTimer inherits QObject()
timer.inherits("QTimer")# returns true
timer.inherits("QObject")# returns true
timer.inherits("QAbstractButton")# returns false
# QVBoxLayout inherits QObject and QLayoutItem
layout = QVBoxLayout()
layout.inherits("QObject")# returns true
layout.inherits("QLayoutItem")# returns true(even though QLayoutItem is not a QObject)

如果为了强制转换对象而需要确定对象是否是特定类的实例,请考虑使用qobject_cast<Type*>(object)。

应用场景

内存管理机制

当创建一个QObject时,如果使用了其他对象作为其父对象 那么,它就会被添加到父对象的children()列表中.当父对象被销毁时,这个QObject也会被销毁

  • 涉及到Qt对象内存管理机制
  • 如果一个控件,没有任何父控件,那么就会被当成顶层控件(窗口)
  • 如果想要一个控件被包含在另外一个控件内部,就需要设置父子关系
顶层控件

如果一个控件,没有任何父控件,那么就会被当成顶层控件(窗口)

多个顶层窗口相互独立

如果想要一个控件被包含在另外一个控件内部,就需要设置父子关系

  • 显示位置受父控件约束
  • 生命周期也被父对象接管

安装过滤器

  • installEventFilter(filterObj)

    filterObj – PySide6.QtCore.QObject

    在此对象上安装事件筛选器filterObj。例如:

    monitoredObj.installEventFilter(filterObj)
    

    事件筛选器是一个接收发送到此对象的所有事件的对象。筛选器可以停止事件,也可以将其转发到此对象。事件过滤器filterObj通过其eventFilter()函数接收事件。如果事件应该被过滤(即停止),eventFilter()函数必须返回true;否则它必须返回false。
    如果在单个对象上安装了多个事件筛选器,则会首先激活上次安装的筛选器。
    这里有一个KeyPressEater类,它吃掉被监控对象的按键:

    class KeyPressEater(QObject):
    
        Q_OBJECT
        ...
    # protected
        eventFilter = bool(QObject obj,QEvent event)
    
    def eventFilter(self,QObject obj,QEvent event):
    
        if event.type()== QEvent.KeyPress:
            keyEvent = QKeyEvent(event)
            qDebug("Ate key press %d",keyEvent.key())
            return True
        else:
            # standard event processing
            return QObject.eventFilter(obj,event)
    

    以下是如何在两个小部件上安装它:

    keyPressEater = KeyPressEater(self)
    pushButton = QPushButton(self)
    listView = QListView(self)
    pushButton.installEventFilter(keyPressEater)
    listView.installEventFilter(keyPressEater)
    

    例如,QShortcut类使用这种技术来拦截快捷键的按下。

    请注意,筛选对象必须与此对象位于同一线程中。如果filterObj在另一个线程中,则此函数不执行任何操作。如果filterObj或此对象在调用此函数后被移动到另一个线程,则在两个对象再次具有相同的线程相关性之前(不会删除),不会调用事件筛选器。

信号处理

此处只作简单说明更详细介绍在进阶篇中做更多介绍。

API

方法 说明
widget.信号方法.connect(槽函数) 连接信号与槽
obj.disconnect() 取消连接信号与槽
obj:可为空间或信号 控件:取消控件的所有信号连接 信号:取消指定信号的连接
widget.blockSignals(bool) 临时(取消)阻止指定控件所有的信号与槽的连接
widget.signalsBlocked() 信号是否被阻止
widget.receivers(信号) 返回连接到信号的接收器数量

connect方法介绍

  • connect(arg__1,arg__2,arg__3[,type=Qt.AutoConnection])

    PARAMETERS:

    • arg__1 – PySide6.QtCore.QObject__
    • __arg__2 – str
    • arg__3 – PyCallable
    • type – ConnectionType

    RETURN TYPE:

    • PySide6.QtCore.QMetaObject.Connection
  • connect(sender,signal,receiver,method[,type=Qt.AutoConnection])

    PARAMETERS:

    • sender – PySide6.QtCore.QObject
    • signal – PySide6.QtCore.QMetaMethod
    • receiver – PySide6.QtCore.QObject
    • method – PySide6.QtCore.QMetaMethod
    • type – ConnectionType

    RETURN TYPE:

    • PySide6.QtCore.QMetaObject.Connection

    创建从发送方对象中的信号到接收方对象中的方法的给定类型的连接。返回连接的句柄,该句柄可用于以后断开连接。
    如果无法创建连接,则Connection句柄将无效,例如,参数无效。您可以通过将Connection强制转换为bool来检查它是否有效。
    此函数的工作方式与connect(const QObjectsender、const charsignal、const QOobjectreceiver、const charmethod、Qt::ConnectionType类型)相同,但它使用QMetaMethod来指定信号和方法。

  • connect(sender,signal,receiver,member[,type=Qt.AutoConnection])

    PARAMETERS:

    • sender – PySide6.QtCore.QObject

    • signal – str

    • receiver – PySide6.QtCore.QObject

    • member – str

    • type – ConnectionType

    RETURN TYPE:

    • PySide6.QtCore.QMetaObject.Connection

    创建从发送方对象中的信号到接收方对象中的方法的给定类型的连接。返回连接的句柄,该句柄可用于以后断开连接。
    指定信号和方法时,必须使用SIGNAL()和SLOT()宏,例如:

    label = QLabel()
    scrollBar = QScrollBar()
    QObject.connect(scrollBar,SIGNAL(valueChanged(int)),label,SLOT(setNum(int)))
    

    此示例确保标签始终显示当前滚动条值。请注意,signal和slots参数不能包含任何变量名,只能包含类型。例如,以下操作不起作用,返回false:

    # WRONG
    QObject.connect(scrollBar,SIGNAL(valueChanged(int value)),label,SLOT(setNum(int value)))
    

    一个信号也可以连接到另一个信号:

    class MyWidget(QWidget):
    
        Q_OBJECT
    # public
        MyWidget()
    # signals
        def buttonClicked():
    # private
        myButton = QPushButton()
    
    def __init__(self):
    
        myButton = QPushButton(self)
        connect(myButton,SIGNAL(clicked()),
                self,SIGNAL(buttonClicked()))
    

    在本例中,MyWidget构造函数中继来自私有成员变量的信号,并以与MyWidget相关的名称使其可用。
    一个信号可以连接到许多插槽和信号。许多信号可以连接到一个插槽。
    如果一个信号连接到多个插槽,则在发出信号时,这些插槽将按照与连接相同的顺序激活。
    如果函数成功地将信号连接到插槽,则返回一个Connection,该Connection表示连接的句柄。如果无法创建连接,例如,如果QObject无法验证信号或方法的存在,或者它们的签名不兼容,则连接句柄将无效。您可以通过将句柄强制转换为bool来检查它是否有效。
    默认情况下,每次连接都会发出一个信号;针对重复连接发射两个信号。您可以通过一个disconnect()调用断开所有这些连接。如果传递UniqueConnection类型,则只有在不重复的情况下才会建立连接。如果已经存在重复(对相同对象上完全相同的插槽发出完全相同的信号),则连接将失败,并且连接将返回无效的连接。

    Qt::UniqueConnections不适用于lambdas、非成员函数和函子;它们仅适用于连接到成员函数。

    可选类型参数描述了要建立的连接的类型。特别地,它确定特定信号是立即传送到时隙还是排队等待稍后传送。如果信号排队,则参数必须是Qt的元对象系统已知的类型,因为Qt需要复制参数以将其存储在幕后事件中。如果您尝试使用排队连接并获得错误消息

    QObject.connect: Cannot queue arguments of type'MyType'
    (Make sure'MyType'is registered using qRegisterMetaType().)
    

    在建立连接之前,调用qRegisterMetaType()来注册数据类型。

    可选类型参数描述了要建立的连接的类型。特别地,它确定特定信号是立即传送到时隙还是排队等待稍后传送。如果信号排队,则参数必须是Qt的元对象系统已知的类型,因为Qt需要复制参数以将其存储在幕后事件中。如果您尝试使用排队连接并获得错误消息

  • connect(sender,signal,member[,type=Qt.AutoConnection])
    PARAMETERS:

    • sender – PySide6.QtCore.QObject

    • signal – str

    • member – str

    • type – ConnectionType

    RETURN TYPE:

    • PySide6.QtCore.QMetaObject.Connection

    此函数重载connect()。
    将来自发送方对象的信号连接到此对象的方法。
    等效于连接(发送器、信号、此、方法、类型)。
    您建立的每个连接都会发出一个信号,因此重复的连接会发出两个信号。您可以使用disconnect()断开连接。

  • connect(arg__1,arg__2[,type=Qt.AutoConnection])
    PARAMETERS:

    • arg__1 – str

    • arg__2 – PyCallable

    • type – ConnectionType

    RETURN TYPE:

    • PySide6.QtCore.QMetaObject.Connection
  • connect(arg__1,arg__2,arg__3[,type=Qt.AutoConnection])
    PARAMETERS:

    • arg__1 – str

    • arg__2 – PySide6.QtCore.QObject

    • arg__3 – str

    • type – ConnectionType

    RETURN TYPE:

    • PySide6.QtCore.QMetaObject.Connection

disconnect方法介绍

  • disconnect(receiver[,member=None])
    PARAMETERS:

    • receiver – PySide6.QtCore.QObject

    • member – str

    RETURN TYPE:

    • bool

    此函数重载disconnect()。
    将此对象中的所有信号与接收器的方法断开连接。
    当涉及的任何一个对象被破坏时,信号槽连接将被移除。

  • disconnect(signal,receiver,member)
    PARAMETERS:

    • signal – str

    • receiver – PySide6.QtCore.QObject

    • member – str

    RETURN TYPE:

    • bool

    此函数重载disconnect()。
    断开信号与接收器方法的连接。
    当涉及的任何一个对象被破坏时,信号槽连接将被移除。

    断开所有信号插槽连接也会断开destroyed()信号(如果已连接)。这样做可能会对依赖此信号清理资源的类产生不利影响。建议仅断开由应用程序代码连接的特定信号。

  • disconnect(arg__1,arg__2)
    PARAMETERS:

    • arg__1 – str

    • arg__2 – PyCallable

    RETURN TYPE:

    • bool
  • disconnect(sender,signal,receiver,member)
    PARAMETERS:

    • sender – PySide6.QtCore.QObject

    • signal – str

    • receiver – PySide6.QtCore.QObject

    • member – str

    RETURN TYPE:

    • bool

    断开对象发送器中的信号与对象接收器中的方法的连接。如果连接已成功断开,则返回true;否则返回false。
    当涉及的任何一个对象被破坏时,信号槽连接将被移除。
    disconnect()通常有三种使用方式,如下例所示。

    1. 断开连接到对象信号的所有连接:
    disconnect(myObject,None,None,None)
    
    • 等效于非静态重载函数

      myObject.disconnect()
      
    1. 断开连接到特定信号的所有设备:

      disconnect(myObject,SIGNAL(mySignal()),None,None)
      

    等效于非静态重载函数

    
    myObject.disconnect(SIGNAL(mySignal()))
    

  1. 断开特定接收器的连接:

    disconnect(myObject,None,myReceiver,None)
    

    等效于非静态重载函数

    myObject.disconnect(myReceiver)
    

None可以用作通配符,分别表示"任何信号"、“任何接收对象"或"接收对象中的任何插槽”。
发件人可能永远不会是"无"。(不能在一次调用中断开多个对象的信号。)
如果信号为None,则会断开接收器和方法与任何信号的连接。如果没有,则仅断开指定的信号。
如果接收器为"无",则断开任何连接到信号的东西。否则,接收器以外的对象中的插槽不会断开连接。
如果方法为None,它将断开连接到接收器的任何东西。如果没有,则只有名为method的插槽将断开连接,而所有其他插槽都将单独保留。如果省略了receiver,则该方法必须为None,因此无法断开所有对象上特定命名的插槽的连接。

  • disconnect(sender,signal,receiver,member)
    PARAMETERS:

    • sender – PySide6.QtCore.QObject

    • signal – PySide6.QtCore.QMetaMethod

    • receiver – PySide6.QtCore.QObject

    • member – PySide6.QtCore.QMetaMethod

    RETURN TYPE:

    • bool

    断开对象发送器中的信号与对象接收器中的方法的连接。如果连接已成功断开,则返回true;否则返回false。
    此函数提供了与断开连接相同的可能性(const QObjectsender、const charsignal、const QOobjectreceiver、const charmethod),但使用QMetaMethod表示要断开连接的信号和方法。
    此外,如果出现以下情况,此函数将返回false,并且没有信号和插槽断开:

    • 信号不是发送方类的成员或其父类之一。
    • 方法不是接收器类的成员或其父类之一。
    • 信号实例不表示信号。

    QMetaMethod()可以用作通配符,意思是"任何信号"或"接收对象中的任何插槽"。同样,"无"也可以用于"任何接收对象"意义上的接收器。在这种情况下,方法也应该是QMetaMethod()。sender参数不应为None。

  • disconnect(arg__1,arg__2,arg__3)
    PARAMETERS:

    • arg__1 – PySide6.QtCore.QObject

    • arg__2 – str

    • arg__3 – PyCallable

    RETURN TYPE:

    • bool
  • disconnect(arg__1)
    PARAMETERS:

    • arg__1 – PySide6.QtCore.QMetaObject.Connection

    RETURN TYPE:

    • bool

    断开连接。
    如果连接无效或已断开连接,则不执行任何操作并返回false。

应用场景

  • 监听信号,响应用户行为
  • 信号与槽机制

类型判定

API

  • isWidgetType()是否是控件类型 继承自QWidget类
  • inherits(父类)一个对象是否继承(直接或者间接)自某个类

应用场景

过滤筛选控件

对象删除

obj.deleteLater()

删除一个对象时,也会解除它与父对象之间的关系 deleteLater()并没有将对象立即销毁,而是向主消息循环发送了一个event,下一次主消息循环收到这个event之后才会销毁对象 这样做的好处是可以在这些延迟删除的时间内完成一些操作,坏处就是内存释放会不及时

想要移除某一个对象的时候使用,不同于python的del方法,会直接删除对象对应的子组件

事件处理

API

方法 说明
childEvent()
customEvent()
eventFilter()
installEventFilter()
removeEventFilter
event()

应用场景

  • 事件机制
  • 拦截事件,监听特定行为

定时器

API

方法 说明
startTimer(ms,Qt.TimerType)-> timer_id 开启一个定时器
TimerType见枚举值
timer_id 定时器的唯一标识
killTimer(timer_id) 根据定时器ID,杀死定时器
timerEvent() 定时器执行事件
  • PySide6.QtCore.Qt.TimerType
    Qt.PreciseTimer 精确定时器:尽可能保持毫秒准确
    Qt.CoarseTimer 粗定时器:5%的误差间隔Qt.VeryCoarseTimer 很粗的定时器:只能到秒级

在UNIX(包括Linux、macOS和iOS)上,Qt将保持Qt::PreciseTimer的毫秒精度。对于Qt::CoarseTimer,间隔将调整至5%,以使计时器与预计在同一时间或大约同一时间启动的其他计时器对齐。其目的是使大多数定时器同时唤醒,从而减少CPU唤醒和功耗。
在Windows上,Qt将为Qt::PreciseTimer使用Windows的多媒体计时器功能(如果可用),并为Qt:::CoarseTimer和Qt::VeryCoarseTimer使用普通Windows计时器。
在所有平台上,Qt::VeryCoarseTimer的间隔四舍五入到最接近的整秒(例如,23500ms的间隔将四舍五五入到24000ms,20300ms到20000ms)。

class MyObject(QObject):

    Q_OBJECT
# public
    MyObject(QObject parent = None)
# protected
    def timerEvent(event):

def __init__(self,parent):
    super().__init__(parent)

    startTimer(50)# 50-millisecond timer
    startTimer(1000)# 1-second timer
    startTimer(60000)# 1-minute timer
    namespace = using()
    startTimer(milliseconds(50))
    startTimer(seconds(1))
    startTimer(minutes(1))
    # since C++14 we can use std::chrono::duration literals,e.g.:
    startTimer(100ms)
    startTimer(5s)
    startTimer(2min)
    startTimer(1h)

def timerEvent(self,event):

    print("Timer ID:",event.timerId())

请注意,QTimer的准确性取决于底层操作系统和硬件。timerType参数允许您自定义计时器的准确性。有关不同计时器类型的信息,请参阅计时器类型。大多数平台支持20毫秒的精度;有些提供了更多。如果Qt无法提供所请求的定时器事件数,它将静默地丢弃一些。
QTimer类提供了一个高级编程接口,该接口具有单触发定时器和定时器信号,而不是事件。还有一个QBasicTimer类,它比QTimer更轻,也比直接使用计时器ID更不笨拙。

应用场景

  • 轮询
  • 倒计时

语言翻译

tr()

应用场景:多语言国际化支持

信号

信号 说明
objectNameChanged(objectName:str) 此信号是在对象名称更改后发出的。新的对象名称作为objectName传递。
destroyed([object:PySide6.QtCore.QObject=None]) 该信号在对象obj被销毁之前立即发出,在QPointer的任何实例被通知之后,并且不能被阻止。
该信号发出后,所有对象的子对象都会立即被销毁。

你可能感兴趣的:(pyside6学习笔记,开发语言,python)