QObject Class

QObject 클래스는 모든 Qt 객체의 베이스 클래스입니다. 더 보기...

Header: #include <QObject>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
상속 대상:
284 유형

Q3DGraphsWidgetItem, Q3DObject, Q3DScene, Q3DTheme, QAbstract3DAxis, QAbstract3DInputHandler, QAbstract3DSeries, QAbstractAnimation, QAbstractAxis, QAbstractDataProxy, QAbstractEventDispatcher, QAbstractHttpServer, QAbstractItemDelegate, QAbstractItemModel, QAbstractItemModelTester, QAbstractNetworkCache, QAbstractOAuth, QAbstractOAuthReplyHandler, QAbstractSeries, QAbstractState, QAbstractTextDocumentLayout, QAbstractTransition, QAccessiblePlugin, QAction, QActionGroup, QAmbientSound, QAudioBufferInput, QAudioBufferOutput, QAudioDecoder, QAudioEngine, QAudioInput, QAudioListener, QAudioOutput, QAudioRoom, QAudioSink, QAudioSource, QAxBaseObject, QAxFactory, QAxScript, QAxScriptManager, QBarModelMapper, QBarSet, QBluetoothDeviceDiscoveryAgent, QBluetoothLocalDevice, QBluetoothServer, QBluetoothServiceDiscoveryAgent, QBoxSet, QButtonGroup, QCamera, QCanBus, QCanBusDevice, QCandlestickModelMapper, QCandlestickSet, QChronoTimer, QClipboard, QCoapClient, QCompleter, QCoreApplication, QCustom3DItem, QDataWidgetMapper, QDBusAbstractAdaptor, QDBusAbstractInterface, QDBusPendingCallWatcher, QDBusServer, QDBusServiceWatcher, QDBusVirtualObject, QDesignerFormEditorInterface, QDesignerFormWindowManagerInterface, QDnsLookup, QDrag, QDtls, QDtlsClientVerifier, QEventLoop, QExtensionFactory, QExtensionManager, QFileSelector, QFileSystemWatcher, QFutureWatcher, QGenericPlugin, QGeoAreaMonitorSource, QGeoCodeReply, QGeoCodingManager, QGeoCodingManagerEngine, QGeoPositionInfoSource, QGeoRouteReply, QGeoRoutingManager, QGeoRoutingManagerEngine, QGeoSatelliteInfoSource, QGeoServiceProvider, QGesture, QGraphicsAnchor, QGraphicsEffect, QGraphicsItemAnimation, QGraphicsObject, QGraphicsScene, QGraphicsTransform, QGraphsTheme, QGrpcClientBase, QGrpcOperation, QGrpcOperationContext, QHelpEngineCore, QHelpFilterEngine, QHelpSearchEngine, QHelpSearchEngineCore, QHttpMultiPart, QIconEnginePlugin, QImageCapture, QImageIOPlugin, QInputDevice, QInputMethod, QIODevice, QItemSelectionModel, QJSEngine, QLayout, QLegendMarker, QLibrary, QLocalServer, QLowEnergyController, QLowEnergyService, QMaskGenerator, QMediaCaptureSession, QMediaDevices, QMediaPlayer, QMediaRecorder, QMimeData, QModbusDevice, QModbusReply, QMovie, QMqttClient, QMqttSubscription, QNearFieldManager, QNearFieldTarget, QNetworkAccessManager, QNetworkCookieJar, QNetworkInformation, QObjectCleanupHandler, QOffscreenSurface, QOpcUaClient, QOpcUaGdsClient, QOpcUaGenericStructHandler, QOpcUaHistoryReadResponse, QOpcUaKeyPair, QOpcUaNode, QOpcUaProvider, QOpenGLContext, QOpenGLContextGroup, QOpenGLDebugLogger, QOpenGLShader, QOpenGLShaderProgram, QOpenGLTimeMonitor, QOpenGLTimerQuery, QOpenGLVertexArrayObject, QPdfDocument, QPdfPageNavigator, QPdfPageRenderer, QPdfWriter, QPieModelMapper, QPieSlice, QPlaceManager, QPlaceManagerEngine, QPlaceReply, QPluginLoader, QQmlComponent, QQmlContext, QQmlEngineExtensionPlugin, QQmlExpression, QQmlExtensionPlugin, QQmlFileSelector, QQmlImageProviderBase, QQmlPropertyMap, QQuick3DObject, QQuickAttachedPropertyPropagator, QQuickImageResponse, QQuickItem, QQuickItemGrabResult, QQuickRenderControl, QQuickTextDocument, QQuickTextureFactory, QQuickWebEngineProfile, QRemoteObjectAbstractPersistedStore, QRemoteObjectNode, QRemoteObjectPendingCallWatcher, QRemoteObjectReplica, QRestAccessManager, QScreen, QScreenCapture, QScroller, QScxmlDataModel, QScxmlInvokableService, QScxmlInvokableServiceFactory, QScxmlStateMachine, QSensor, QSensorBackend, QSensorReading, QSessionManager, QSettings, QSGTexture, QSGTextureProvider, QSharedMemory, QShortcut, QSignalMapper, QSocketNotifier, QSoundEffect, QSpatialSound, QSqlDriver, QSqlDriverPlugin, QStyle, QStyleHints, QStylePlugin, QSvgRenderer, QSyntaxHighlighter, QSystemTrayIcon, Qt3DAnimation::QAbstractAnimation, Qt3DAnimation::QAnimationController, Qt3DAnimation::QAnimationGroup, Qt3DAnimation::QMorphTarget, Qt3DCore::QAbstractAspect, Qt3DCore::QAspectEngine, Qt3DCore::QNode, Qt3DCore::Quick::QQmlAspectEngine, Qt3DInput::QInputDeviceIntegration, Qt3DInput::QKeyEvent, Qt3DInput::QMouseEvent, Qt3DInput::QWheelEvent, Qt3DRender::QGraphicsApiFilter, Qt3DRender::QPickEvent, Qt3DRender::QRenderCapabilities, Qt3DRender::QRenderCaptureReply, Qt3DRender::QStencilOperationArguments, Qt3DRender::QStencilTestArguments, Qt3DRender::QTextureWrapMode, QTcpServer, QTextDocument, QTextObject, QTextToSpeech, QThread, QThreadPool, QTimeLine, QTimer, QTranslator, QUiLoader, QUndoGroup, QUndoStack, QValidator, QValue3DAxisFormatter, QVideoFrameInput, QVideoSink, QVirtualKeyboardAbstractInputMethod, QVirtualKeyboardDictionary, QVirtualKeyboardDictionaryManager, QVirtualKeyboardInputContext, QVirtualKeyboardInputEngine, QVirtualKeyboardObserver, QVirtualKeyboardTrace, QWaylandClient, QWaylandObject, QWaylandQuickShellIntegration, QWaylandSurfaceGrabber, QWaylandView, QWaylandXdgPopup, QWaylandXdgToplevel, QWebChannel, QWebChannelAbstractTransport, QWebEngineClientHints, QWebEngineContextMenuRequest, QWebEngineCookieStore, QWebEngineDownloadRequest, QWebEngineHistory, QWebEngineNavigationRequest, QWebEngineNewWindowRequest, QWebEngineNotification, QWebEnginePage, QWebEngineProfile, QWebEngineUrlRequestInterceptor, QWebEngineUrlRequestJob, QWebEngineUrlSchemeHandler, QWebEngineWebAuthUxRequest, QWebSocket, QWebSocketServer, QWidget, QWindow, QWindowCapture, QWinEventNotifier, and QXYModelMapper

참고: 이 클래스의 모든 함수는 재진입합니다.

참고: 이 함수들은 스레드 안전합니다:

  • connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
  • connect(const QObject *sender, const char *signal, const char *method, Qt::ConnectionType type) const
  • connect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType type)
  • connect(const QObject *sender, PointerToMemberFunction 신호, Functor functor)
  • connect(const QObject *sender, PointerToMemberFunction signal, const QObject *context, Functor functor, Qt::ConnectionType type)
  • disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)
  • disconnect(const char *signal, const QObject *receiver, const char *method) const
  • disconnect(const QObject *sender, PointerToMemberFunction 신호, const QObject *receiver, PointerToMemberFunction 메서드)
  • deleteLater()

속성

공용 기능

QObject(QObject *parent = nullptr)
virtual ~QObject()
QBindable<QString> bindableObjectName()
bool blockSignals(bool block)
const QObjectList &children() const
QMetaObject::Connection connect(const QObject *sender, const char *signal, const char *method, Qt::ConnectionType type = Qt::AutoConnection) const
bool disconnect(const QObject *receiver, const char *method = nullptr) const
bool disconnect(const char *signal = nullptr, const QObject *receiver = nullptr, const char *method = nullptr) const
void dumpObjectInfo() const
void dumpObjectTree() const
QList<QByteArray> dynamicPropertyNames() const
virtual bool event(QEvent *e)
virtual bool eventFilter(QObject *watched, QEvent *event)
T findChild(QAnyStringView name, Qt::FindChildOptions options = Qt::FindChildrenRecursively) const
(since 6.7) T findChild(Qt::FindChildOptions options = Qt::FindChildrenRecursively) const
QList<T> findChildren(QAnyStringView name, Qt::FindChildOptions options = Qt::FindChildrenRecursively) const
(since 6.3) QList<T> findChildren(Qt::FindChildOptions options = Qt::FindChildrenRecursively) const
QList<T> findChildren(const QRegularExpression &re, Qt::FindChildOptions options = Qt::FindChildrenRecursively) const
bool inherits(const char *className) const
void installEventFilter(QObject *filterObj)
(since 6.4) bool isQuickItemType() const
bool isWidgetType() const
bool isWindowType() const
void killTimer(int id)
(since 6.8) void killTimer(Qt::TimerId id)
virtual const QMetaObject *metaObject() const
bool moveToThread(QThread *targetThread)
QString objectName() const
QObject *parent() const
QVariant property(const char *name) const
void removeEventFilter(QObject *obj)
void setObjectName(const QString &name)
(since 6.4) void setObjectName(QAnyStringView name)
void setParent(QObject *parent)
bool setProperty(const char *name, const QVariant &value)
(since 6.6) bool setProperty(const char *name, QVariant &&value)
bool signalsBlocked() const
int startTimer(int interval, Qt::TimerType timerType = Qt::CoarseTimer)
int startTimer(std::chrono::nanoseconds interval, Qt::TimerType timerType = Qt::CoarseTimer)
QThread *thread() const

공용 슬롯

void deleteLater()

신호

void destroyed(QObject *obj = nullptr)
void objectNameChanged(const QString &objectName)

정적 공용 멤버

QMetaObject::Connection connect(const QObject *sender, const QMetaMethod &signal, const QObject *receiver, const QMetaMethod &method, Qt::ConnectionType type = Qt::AutoConnection)
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, const QObject *context, Functor functor, Qt::ConnectionType type = Qt::AutoConnection)
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType type = Qt::AutoConnection)
bool disconnect(const QMetaObject::Connection &connection)
bool disconnect(const QObject *sender, const QMetaMethod &signal, const QObject *receiver, const QMetaMethod &method)
bool disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)
bool disconnect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method)
const QMetaObject staticMetaObject
QString tr(const char *sourceText, const char *disambiguation = nullptr, int n = -1)

보호된 기능

virtual void childEvent(QChildEvent *event)
virtual void connectNotify(const QMetaMethod &signal)
virtual void customEvent(QEvent *event)
virtual void disconnectNotify(const QMetaMethod &signal)
bool isSignalConnected(const QMetaMethod &signal) const
int receivers(const char *signal) const
QObject *sender() const
int senderSignalIndex() const
virtual void timerEvent(QTimerEvent *event)
QObjectList
(since 6.8) enum class TimerId { Invalid }
T qobject_cast(QObject *object)
T qobject_cast(const QObject *object)

매크로

상세 설명

QObject는 Qt 객체 모델의 핵심입니다. 이 모델의 핵심 기능은 신호와 슬롯이라는 원활한 객체 통신을 위한 매우 강력한 메커니즘입니다. connect ()로 신호를 슬롯에 연결하고 disconnect()로 연결을 끊을 수 있습니다. 알림 루프가 끝나지 않도록 하려면 blockSignals()로 신호를 일시적으로 차단할 수 있습니다. 보호된 함수 connectNotify() 및 disconnectNotify()를 사용하면 연결을 추적할 수 있습니다.

QObject는 객체 트리에서 스스로를 구성합니다. 다른 개체를 부모로 하여 QObject를 만들면 해당 개체는 자동으로 부모의 children() 목록에 자신을 추가합니다. 부모는 객체의 소유권을 가지며, 즉 소멸자에서 자식을 자동으로 삭제합니다. 이름으로 개체를 찾고 findChild() 또는 findChildren()을 사용하여 선택적으로 입력할 수 있습니다.

모든 객체에는 objectName()가 있으며 해당 클래스 이름은 해당 metaObject()를 통해 찾을 수 있습니다( QMetaObject::className() 참조). inherits () 함수를 사용하여 개체의 클래스가 QObject 상속 계층 구조에서 다른 클래스를 상속하는지 여부를 확인할 수 있습니다.

개체가 삭제되면 destroyed() 신호를 보냅니다. 이 신호를 포착하여 QObject에 대한 참조가 매달려 있는 것을 방지할 수 있습니다.

QObject는 event()를 통해 이벤트를 수신하고 다른 객체의 이벤트를 필터링할 수 있습니다. 자세한 내용은 installEventFilter() 및 eventFilter()를 참조하세요. 편의 핸들러인 childEvent()를 다시 구현하여 자식 이벤트를 잡을 수 있습니다.

마지막으로, QObject는 Qt에서 기본적인 타이머 지원을 제공합니다. 타이머에 대한 높은 수준의 지원은 QChronoTimer 을 참조하십시오.

신호, 슬롯 또는 프로퍼티를 구현하는 모든 객체에는 Q_OBJECT 매크로가 필수라는 점에 유의하세요. 또한 소스 파일에서 Meta-Object Compiler를 실행해야 합니다. 이 매크로를 사용하지 않으면 특정 함수가 이상한 동작을 보일 수 있으므로 신호, 슬롯 및 프로퍼티를 실제로 사용하는지 여부에 관계없이 QObject의 모든 하위 클래스에서 이 매크로를 사용할 것을 강력히 권장합니다.

모든 Qt 위젯은 QObject를 상속합니다. 편의 함수 isWidgetType()는 객체가 실제로 위젯인지 여부를 반환합니다. qobject_cast <QWidget *>(obj) 또는 obj->inherits("QWidget")보다 훨씬 빠릅니다.

children()와 같은 일부 QObject 함수는 QObjectList 을 반환합니다. QObjectListQList<QObject *>에 대한 typedef입니다.

스레드 선호도

QObject 인스턴스는 스레드 선호도가 있거나 특정 스레드에 있다고 합니다. QObject가 queued signal 또는 게시된 이벤트를 수신하면 슬롯 또는 이벤트 핸들러가 해당 객체가 있는 스레드에서 실행됩니다.

참고: QObject에 스레드 선호도가 없는 경우(즉, thread()가 0을 반환하는 경우) 또는 실행 중인 이벤트 루프가 없는 스레드에 있는 경우 큐에 대기 중인 신호나 게시된 이벤트를 수신할 수 없습니다.

기본적으로 QObject는 생성된 스레드에 있습니다. 개체의 스레드 선호도는 thread()를 사용하여 쿼리하고 moveToThread()를 사용하여 변경할 수 있습니다.

모든 QObject는 부모와 같은 스레드에 있어야 합니다. 결과적으로

  • setParent()는 관련된 두 QObject가 서로 다른 스레드에 있으면 실패합니다.
  • QObject가 다른 스레드로 이동하면 모든 자식도 자동으로 이동됩니다.
  • moveToThread()는 QObject에 부모가 있는 경우 실패합니다.
  • QThread::run() 내에서 QObject가 생성된 경우 QThreadQThread::run() 를 호출하는 스레드에 존재하지 않으므로 QThread 객체의 자식이 될 수 없습니다.

참고: QObject의 멤버 변수는 자동으로 그 자식이 되지 않습니다. 부모-자식 관계는 자식의 constructor 에 대한 포인터를 전달하거나 setParent()을 호출하여 설정해야 합니다. 이 단계가 없으면 moveToThread()가 호출될 때 객체의 멤버 변수는 이전 스레드에 남아 있습니다.

복사 생성자 또는 할당 연산자 없음

QObject에는 복사 생성자나 할당 연산자가 없습니다. 이는 의도된 것입니다. 실제로는 선언되어 있지만 Q_DISABLE_COPY() 매크로와 함께 private 섹션에 있습니다. 실제로 QObject에서 파생된 모든 Qt 클래스(직접적이든 간접적이든)는 이 매크로를 사용하여 복사 생성자와 할당 연산자를 비공개로 선언합니다. 그 이유는 Qt 객체 모델 페이지의 Identity 대 Value에 대한 토론에서 찾을 수 있습니다.

주요 결과는 QObject 서브클래스를 값으로 사용하고 싶을 때 QObject에 대한 포인터(또는 QObject 서브클래스에 대한 포인터)를 사용해야 한다는 것입니다. 예를 들어, 복사 생성자가 없으면 컨테이너 클래스 중 하나에 저장할 값으로 QObject의 하위 클래스를 사용할 수 없습니다. 포인터를 저장해야 합니다.

자동 연결

Qt의 메타 객체 시스템은 QObject 서브클래스와 그 자식 간의 신호와 슬롯을 자동으로 연결하는 메커니즘을 제공합니다. 객체가 적절한 객체 이름으로 정의되고 슬롯이 간단한 명명 규칙을 따르는 한, 이 연결은 QMetaObject::connectSlotsByName() 함수를 통해 런타임에 수행될 수 있습니다.

uic는 이 함수를 호출하는 코드를 생성하여 생성된 양식의 위젯 간에 Qt Widgets Designer. 자동 연결 사용에 대한 자세한 내용은 Qt Widgets Designer 를 사용한 자동 연결에 대한 자세한 내용은 애플리케이션에서 디자이너 UI 파일 사용하기 섹션의 Qt Widgets Designer 매뉴얼의

동적 속성

동적 프로퍼티는 런타임에 QObject 인스턴스에 추가하거나 제거할 수 있습니다. 동적 프로퍼티는 컴파일 타임에 선언할 필요가 없지만 정적 프로퍼티와 동일한 이점을 제공하며 동일한 API( property()를 사용하여 읽고 setProperty()를 사용하여 조작할 수 있습니다.

동적 프로퍼티는 Qt Widgets Designer에서 지원되며, 표준 Qt 위젯과 사용자가 만든 폼 모두 동적 프로퍼티를 지정할 수 있습니다.

국제화(I18n)

모든 QObject 서브클래스는 Qt의 번역 기능을 지원하므로 애플리케이션의 사용자 인터페이스를 다른 언어로 번역할 수 있습니다.

사용자가 볼 수 있는 텍스트를 번역 가능하게 만들려면 tr() 함수에 대한 호출로 텍스트를 래핑해야 합니다. 이는 번역을 위한 소스 코드 작성 문서에 자세히 설명되어 있습니다.

QMetaObject, QPointer, QObjectCleanupHandler, Q_DISABLE_COPY() 및 객체 트리 및 소유권도참조하세요 .

속성 문서

[bindable] objectName : QString

참고: 이 속성은 QProperty 바인딩을 지원합니다.

이 속성은 이 객체의 이름을 보유합니다.

findChild()를 사용하여 이름(및 유형)으로 개체를 찾을 수 있습니다. findChildren ()로 객체 집합을 찾을 수 있습니다.

qDebug("MyClass::setPrecision(): (%s) 잘못된 정밀도 %f",       qPrintable(objectName()), newPrecision);

기본적으로 이 속성에는 빈 문자열이 포함됩니다.

metaObject() 및 QMetaObject::className()도 참조하세요 .

멤버 함수 문서

[explicit invokable] QObject::QObject(QObject *parent = nullptr)

부모 객체가 있는 객체를 생성합니다 parent.

객체의 부모는 객체의 소유자로 볼 수 있습니다. 예를 들어 dialog box 는 포함된 OKCancel 버튼의 부모입니다.

부모 객체의 소멸자는 모든 자식 객체를 소멸합니다.

parentnullptr 으로 설정하면 부모가 없는 객체가 생성됩니다. 객체가 위젯인 경우 최상위 창이 됩니다.

참고: 이 함수는 메타 객체 시스템과 QML을 통해 호출할 수 있습니다. Q_INVOKABLE 을 참조하세요.

parent(), findChild() 및 findChildren()도 참조하세요 .

[virtual noexcept] QObject::~QObject()

개체를 삭제하여 모든 하위 개체를 삭제합니다.

객체와 주고받는 모든 신호가 자동으로 연결이 끊어지고 객체에 대해 보류 중인 모든 게시 이벤트가 이벤트 대기열에서 제거됩니다. 그러나 QObject 하위 클래스를 직접 삭제하는 것보다 deleteLater()를 사용하는 것이 더 안전한 경우가 많습니다.

경고: 모든 자식 개체가 삭제됩니다. 이러한 객체 중 하나라도 스택이나 전역에 있으면 조만간 프로그램이 충돌할 수 있습니다. 부모 객체 외부에서 자식 객체에 대한 포인터를 보유하지 않는 것이 좋습니다. 그래도 그렇게 하는 경우 destroyed() 신호를 통해 객체가 파괴되는 시기를 감지할 수 있습니다.

경고: QObject 으로 전달된 이벤트를 처리하는 동안 삭제하면 충돌이 발생할 수 있습니다. QObject 가 현재 실행 중인 스레드와 다른 스레드에 있는 경우 직접 삭제해서는 안 됩니다. 대신 deleteLater()를 사용하면 이벤트 루프가 보류 중인 모든 이벤트가 전달된 후 개체를 삭제하게 됩니다.

deleteLater()도 참조하세요 .

[noexcept] bool QObject::blockSignals(bool block)

block 이 참이면 이 객체에서 방출되는 신호가 차단됩니다(즉, 신호를 방출해도 연결된 어떤 것도 호출되지 않습니다). block 이 거짓이면 이러한 차단이 발생하지 않습니다.

반환 값은 signalsBlocked()의 이전 값입니다.

이 개체에 대한 신호가 차단된 경우에도 destroyed() 신호가 전송됩니다.

차단된 상태에서 방출되는 신호는 버퍼링되지 않습니다.

signalsBlocked() 및 QSignalBlocker참조하세요 .

[virtual protected] void QObject::childEvent(QChildEvent *event)

이 이벤트 핸들러는 하위 클래스에서 다시 구현하여 자식 이벤트를 수신할 수 있습니다. 이벤트는 event 매개변수로 전달됩니다.

QEvent::ChildAddedQEvent::ChildRemoved 이벤트는 자식이 추가되거나 제거될 때 객체에 전송됩니다. 두 경우 모두 자식이 QObject 이거나 isWidgetType()가 true 을 반환하면 QWidget 이 될 수 있습니다( ChildAdded 의 경우 자식이 아직 완전히 구성되지 않았고 ChildRemoved 의 경우 이미 소멸되었을 수 있기 때문입니다).

QEvent::ChildPolished 이벤트는 자식이 폴리싱되거나 폴리싱된 자식이 추가될 때 위젯에 전송됩니다. 자식 폴리싱 이벤트를 받으면 일반적으로 자식의 구성이 완료된 것입니다. 그러나 이것이 보장되는 것은 아니며 위젯의 생성자가 실행되는 동안 여러 개의 폴리시 이벤트가 전달될 수 있습니다.

모든 자식 위젯에 대해 ChildAdded 이벤트 1개, ChildPolished 이벤트 0개 이상, ChildRemoved 이벤트 1개를 받습니다.

자식이 추가된 후 즉시 제거되면 ChildPolished 이벤트는 생략됩니다. 자식이 생성 및 소멸하는 동안 여러 번 폴리싱되는 경우 동일한 자식에 대해 매번 다른 가상 테이블을 사용하여 여러 개의 자식 폴리싱 이벤트를 받을 수 있습니다.

event()도 참조하세요 .

const QObjectList &QObject::children() const

자식 객체 목록을 반환합니다. QObjectList 클래스는 <QObject> 헤더 파일에 다음과 같이 정의되어 있습니다:

가장 먼저 추가된 자식은 목록의 first 객체이고 마지막으로 추가된 자식은 목록의 last 객체이며, 즉 새 자식이 마지막에 추가됩니다.

QWidget 자식이 raised 또는 lowered 인 경우 목록 순서가 변경됩니다. 위젯이 올라간 위젯은 목록의 마지막 객체가 되고, 내려간 위젯은 목록의 첫 번째 객체가 됩니다.

findChild(), findChildren(), parent() 및 setParent()도 참조하세요 .

[static] QMetaObject::Connection QObject::connect(const QObject *sender, const QMetaMethod &signal, const QObject *receiver, const QMetaMethod &method, Qt::ConnectionType type = Qt::AutoConnection)

sender 객체의 signal 에서 receiver 객체의 method 로의 지정된 type 연결을 생성합니다. 나중에 연결을 끊는 데 사용할 수 있는 연결 핸들을 반환합니다.

매개변수가 유효하지 않은 등 연결을 만들 수 없는 경우 연결 핸들은 유효하지 않습니다. QMetaObject::Connection 을 부울로 캐스팅하여 유효한지 확인할 수 있습니다.

이 함수는 connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type) 와 같은 방식으로 작동하지만 QMetaMethod 을 사용하여 신호와 메서드를 지정합니다.

connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)도 참조하세요 .

[static] QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)

sender 객체의 signal 에서 receiver 객체의 method 로의 지정된 type 연결을 생성합니다. 나중에 연결을 끊는 데 사용할 수 있는 연결에 대한 핸들을 반환합니다.

예를 들어 signalmethod 을 지정할 때는 SIGNAL()SLOT() 매크로를 사용해야 합니다:

QLabel *label = new QLabel;
QScrollBar *scrollBar = new QScrollBar;
QObject::connect(scrollBar, SIGNAL(valueChanged(int)),
                 label,  SLOT(setNum(int)));

이 예에서는 레이블에 항상 현재 스크롤 막대 값이 표시되도록 합니다. 신호 및 슬롯 매개변수에는 변수 이름을 포함해서는 안 되며 유형만 포함해야 합니다. 예를 들어 다음은 작동하지 않고 거짓을 반환합니다:

// WRONG
QObject::connect(scrollBar, SIGNAL(valueChanged(int value)),
                 label, SLOT(setNum(int value)));

신호는 다른 신호에 연결할 수도 있습니다:

class MyWidget : public QWidget
{
    Q_OBJECT

public:
    MyWidget();

signals:
    void buttonClicked();

private:
    QPushButton *myButton;
};

MyWidget::MyWidget()
{
    myButton = new QPushButton(this);
    connect(myButton, SIGNAL(clicked()),
            this, SIGNAL(buttonClicked()));
}

이 예제에서 MyWidget 생성자는 개인 멤버 변수의 신호를 릴레이하고 MyWidget 과 관련된 이름으로 사용할 수 있도록 합니다.

하나의 신호는 여러 슬롯과 신호에 연결할 수 있습니다. 하나의 슬롯에 여러 개의 신호를 연결할 수 있습니다.

신호가 여러 슬롯에 연결된 경우 신호가 방출될 때 연결한 순서와 동일한 순서로 슬롯이 활성화됩니다.

이 함수는 신호를 슬롯에 성공적으로 연결하면 연결 핸들을 나타내는 QMetaObject::Connection 을 반환합니다. 예를 들어 QObject 에서 signal 또는 method 의 존재를 확인할 수 없거나 서명이 호환되지 않는 경우와 같이 연결을 만들 수 없는 경우 연결 핸들은 유효하지 않습니다. 핸들을 부울로 캐스팅하여 핸들이 유효한지 확인할 수 있습니다.

기본적으로 모든 연결에 대해 하나의 신호가 전송되며, 중복 연결의 경우 두 개의 신호가 전송됩니다. disconnect () 호출 한 번으로 이러한 모든 연결을 끊을 수 있습니다. Qt::UniqueConnection type 을 전달하면 중복 연결이 아닌 경우에만 연결이 이루어집니다. 이미 중복(동일한 객체의 동일한 슬롯에 정확히 동일한 신호)이 있는 경우 연결이 실패하고 잘못된 QMetaObject::Connection 을 반환합니다.

참고: Qt::UniqueConnections는 람다, 비 멤버 함수 및 함수에는 작동하지 않으며, 멤버 함수에 연결하는 경우에만 적용됩니다.

선택적 type 매개변수는 설정할 연결 유형을 설명합니다. 특히 특정 신호를 슬롯에 즉시 전달할지 아니면 나중에 전달하기 위해 대기열에 넣을지를 결정합니다. 신호가 큐에 대기 중인 경우, 매개변수는 Qt의 메타 객체 시스템에 알려진 유형이어야 합니다. 왜냐하면 Qt는 인수를 복사하여 백그라운드에서 이벤트에 저장해야 하기 때문입니다. 큐에 대기 중인 연결을 사용하려고 할 때 오류 메시지가 표시되는 경우

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

오류 메시지가 표시되면 연결을 설정하기 전에 qRegisterMetaType()를 호출하여 데이터 유형을 등록하세요.

참고: 이 함수는 스레드에 안전합니다.

disconnect(), sender(), qRegisterMetaType(), Q_DECLARE_METATYPE() 및 문자열 기반 연결과 함수 기반 연결의 차이점도참조하세요 .

[static] template <typename PointerToMemberFunction, typename Functor> QMetaObject::Connection QObject::connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)

이 함수는 connect()를 오버로드합니다.

sender 객체의 signal 에서 functor 로의 연결을 생성하고 연결에 대한 핸들을 반환합니다.

신호는 헤더에 신호로 선언된 함수여야 합니다. 슬롯 함수는 신호에 연결할 수 있는 모든 함수나 함수가 될 수 있습니다. 신호에 슬롯 함수만큼의 인수가 있는 경우 슬롯 함수를 주어진 신호에 연결할 수 있습니다. 신호와 슬롯의 해당 인자 유형 사이에 암시적 변환이 존재해야 합니다.

예시:

void someFunction();
QPushButton *button = new QPushButton;
QObject::connect(button, &QPushButton::clicked, someFunction);

람다 표현식도 사용할 수 있습니다:

QByteArray page = ...;
QTcpSocket *socket = new QTcpSocket;
socket->connectToHost("qt-project.org", 80);
QObject::connect(socket, &QTcpSocket::connected, [=] () {
        socket->write("GET " + page + "\r\n");
    });

발신자가 파괴되면 연결이 자동으로 끊어집니다. 그러나 신호가 방출될 때 함수 내에서 사용된 모든 객체가 여전히 살아있어야 한다는 점에 주의해야 합니다.

따라서 QObject 를 수신자/컨텍스트로 사용하는 connect()의 오버로드를 사용하는 것이 좋습니다. QT_NO_CONTEXTLESS_CONNECT 매크로를 정의하여 컨텍스트 없는 오버로드의 사용을 비활성화할 수 있습니다.

과부하된 함수는 qOverload 을 통해 해결할 수 있습니다.

참고: 이 함수는 스레드에 안전합니다.

QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, const char *method, Qt::ConnectionType type = Qt::AutoConnection) const

이 함수는 connect()를 오버로드합니다.

sender 객체에서 이 객체의 methodsignal 를 연결합니다.

connect(sender, signal, this, method, type)와 동일합니다.

모든 연결은 신호를 방출하므로 중복 연결은 두 개의 신호를 방출합니다. disconnect ()를 사용하여 연결을 끊을 수 있습니다.

참고: 이 함수는 스레드에 안전합니다.

disconnect()도 참조하세요 .

[static] template <typename PointerToMemberFunction, typename Functor> QMetaObject::Connection QObject::connect(const QObject *sender, PointerToMemberFunction signal, const QObject *context, Functor functor, Qt::ConnectionType type = Qt::AutoConnection)

이 함수는 connect()를 오버로드합니다.

sender 객체의 signal 에서 functor 로의 지정된 type 연결을 생성하여 context 의 특정 이벤트 루프에 배치하고 연결에 대한 핸들을 반환합니다.

참고: Qt::UniqueConnections는 람다, 비 멤버 함수 및 함수에는 작동하지 않으며, 멤버 함수에 연결하는 경우에만 적용됩니다.

신호는 헤더에 신호로 선언된 함수여야 합니다. 슬롯 함수는 신호에 연결할 수 있는 모든 함수나 함수가 될 수 있습니다. 신호에 슬롯 함수만큼의 인수가 있는 경우 슬롯 함수를 주어진 신호에 연결할 수 있습니다. 신호와 슬롯의 해당 인자 유형 사이에 암시적 변환이 존재해야 합니다.

예시:

void someFunction();
QPushButton *button = new QPushButton;
QObject::connect(button, &QPushButton::clicked, this, someFunction, Qt::QueuedConnection);

람다 표현식도 사용할 수 있습니다:

QByteArray page = ...;
QTcpSocket *socket = new QTcpSocket;
socket->connectToHost("qt-project.org", 80);
QObject::connect(socket, &QTcpSocket::connected, this, [=] () {
        socket->write("GET " + page + "\r\n");
    }, Qt::AutoConnection);

발신자 또는 컨텍스트가 파괴되면 연결이 자동으로 끊어집니다. 하지만 신호가 방출될 때 함수 내에서 사용된 모든 객체가 여전히 살아있는지 주의해야 합니다.

과부하된 함수는 qOverload 의 도움을 받아 해결할 수 있습니다.

참고: 이 함수는 스레드 안전합니다.

[static] template <typename PointerToMemberFunction> QMetaObject::Connection QObject::connect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType type = Qt::AutoConnection)

이 함수는 connect()를 오버로드합니다.

sender 객체의 signal 에서 receiver 객체의 method 로의 지정된 type 연결을 생성합니다. 나중에 연결을 끊는 데 사용할 수 있는 연결에 대한 핸들을 반환합니다.

신호는 헤더에 신호로 선언된 함수여야 합니다. 슬롯 함수는 신호에 연결할 수 있는 모든 멤버 함수가 될 수 있습니다. 신호에 슬롯 수만큼의 인수가 있고 신호와 슬롯에 해당하는 인수의 유형 사이에 암시적 변환이 있는 경우 슬롯을 주어진 신호에 연결할 수 있습니다.

예시:

QLabel *label = new QLabel;
QLineEdit *lineEdit = new QLineEdit;
QObject::connect(lineEdit, &QLineEdit::textChanged,
                 label,  &QLabel::setText);

이 예는 라벨에 항상 현재 줄 편집 텍스트가 표시되도록 합니다.

하나의 신호는 여러 슬롯과 신호에 연결할 수 있습니다. 하나의 슬롯에 여러 개의 신호를 연결할 수 있습니다.

신호가 여러 슬롯에 연결된 경우 신호가 방출될 때 연결한 순서와 동일한 순서로 슬롯이 활성화됩니다.

이 함수는 신호를 슬롯에 성공적으로 연결하면 연결 핸들을 반환합니다. 예를 들어 QObjectsignal 의 존재를 확인할 수 없는 경우(신호로 선언되지 않은 경우)와 같이 연결을 만들 수 없는 경우 연결 핸들은 유효하지 않습니다. QMetaObject::Connection 를 부울로 캐스팅하여 유효한지 확인할 수 있습니다.

기본적으로 모든 연결에 대해 하나의 신호가 전송되며, 중복 연결의 경우 두 개의 신호가 전송됩니다. disconnect () 호출 한 번으로 이러한 모든 연결을 끊을 수 있습니다. Qt::UniqueConnection type 을 전달하면 중복 연결이 아닌 경우에만 연결이 이루어집니다. 이미 중복(동일한 객체의 동일한 슬롯에 정확히 동일한 신호)이 있는 경우 연결이 실패하고 잘못된 QMetaObject::Connection 을 반환합니다.

선택 사항인 type 매개변수는 설정할 연결 유형을 설명합니다. 특히 특정 신호가 슬롯에 즉시 전달되는지 아니면 나중에 전달하기 위해 대기열에 추가되는지를 결정합니다. 신호가 큐에 대기 중인 경우, 매개변수는 Qt의 메타 객체 시스템에 알려진 유형이어야 합니다. 왜냐하면 Qt는 인수를 복사하여 백그라운드에서 이벤트에 저장해야 하기 때문입니다. 큐에 대기 중인 연결을 사용하려고 할 때 오류 메시지가 표시되는 경우

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

로 인자 유형을 선언해야 합니다. Q_DECLARE_METATYPE

오버로드된 함수는 qOverload 를 사용하여 해결할 수 있습니다.

참고: 이 함수는 스레드에 안전합니다.

문자열 기반 연결과 함수 기반 연결의 차이점도참조하세요 .

[virtual protected] void QObject::connectNotify(const QMetaMethod &signal)

이 가상 함수는 이 객체에서 signal 에 무언가가 연결되었을 때 호출됩니다.

signal 을 특정 신호와 비교하려면 다음과 같이 QMetaMethod::fromSignal()을 사용할 수 있습니다:

if (signal == QMetaMethod::fromSignal(&MyObject::valueChanged)) {
    // signal is valueChanged
}

경고: 이 함수는 객체 지향의 모듈성 원칙을 위반합니다. 하지만 신호에 연결된 경우에만 값비싼 초기화를 수행해야 할 때 유용할 수 있습니다.

경고: 이 함수는 연결을 수행하는 스레드에서 호출되며, 이 스레드는 이 객체가 있는 스레드와는 다른 스레드일 수 있습니다. 이 함수는 QObject 내부 뮤텍스가 잠긴 상태에서도 호출될 수 있습니다. 따라서 isSignalConnected()를 포함한 QObject 함수는 재구현에서 다시 입력할 수 없습니다. 재구현에서 뮤텍스를 잠그면 다른 곳에서 해당 뮤텍스가 잠긴 상태에서 QObject 함수를 호출하지 않도록 주의하세요. 그렇지 않으면 교착 상태가 발생할 수 있습니다.

connect() 및 disconnectNotify()도 참조하세요 .

[virtual protected] void QObject::customEvent(QEvent *event)

이 이벤트 핸들러는 하위 클래스에서 다시 구현하여 사용자 정의 이벤트를 수신할 수 있습니다. 사용자 정의 이벤트는 QEvent::Type 열거형의 QEvent::User 항목만큼 큰 유형 값을 가진 사용자 정의 이벤트로, 일반적으로 QEvent 서브클래스입니다. 이벤트는 event 매개변수로 전달됩니다.

event() 및 QEvent참조하세요 .

[slot] void QObject::deleteLater()

이 객체를 삭제하도록 예약합니다.

제어가 이벤트 루프로 돌아갈 때 객체가 삭제됩니다. 이 함수가 호출될 때 이벤트 루프가 실행되고 있지 않은 경우(예: QCoreApplication::exec() 이전에 개체에서 deleteLater()가 호출된 경우), 이벤트 루프가 시작되면 개체가 삭제됩니다. 메인 이벤트 루프가 중지된 후에 deleteLater()가 호출되면 객체는 삭제되지 않습니다. 실행 중인 이벤트 루프가 없는 스레드에 있는 객체에서 deleteLater()가 호출되면 스레드가 완료되면 객체가 삭제됩니다.

새 이벤트 루프에 들어갔다가 나오는 경우(예: 모달 대화 상자를 여는 경우)에는 지연된 삭제가 수행되지 않으며, 개체를 삭제하려면 컨트롤이 deleteLater()가 호출된 이벤트 루프로 돌아와야 한다는 점에 유의하세요. 이는 이전의 중첩된 이벤트 루프가 아직 실행 중일 때 삭제된 객체에는 적용되지 않습니다: Qt 이벤트 루프는 새로운 중첩된 이벤트 루프가 시작되자마자 해당 객체를 삭제합니다.

Qt가 QCoreApplication::exec() 또는 QEventLoop::exec()를 통해 이벤트 디스패처를 구동하지 않는 상황에서는 지연된 삭제가 자동으로 처리되지 않습니다. 이 시나리오에서 지연된 삭제를 보장하기 위해 다음 해결 방법을 사용할 수 있습니다:

const auto *eventDispatcher = QThread::currentThread()->eventDispatcher();
QObject::connect(eventDispatcher, &QAbstractEventDispatcher::aboutToBlock,
    QThread::currentThread(), []{
        if (QThread::currentThread()->loopLevel() == 0)
            QCoreApplication::sendPostedEvents(nullptr, QEvent::DeferredDelete);
    }
);

참고: 이 함수는 스레드에 안전합니다.

destroyed() 및 QPointer참조하세요 .

[signal] void QObject::destroyed(QObject *obj = nullptr)

이 신호는 obj 개체가 소멸되기 직전, QPointer 인스턴스가 통지된 후 즉시 발신되며 차단할 수 없습니다.

이 신호가 전송된 후 모든 객체의 하위 객체는 즉시 소멸됩니다.

deleteLater() 및 QPointer도 참조하세요 .

[static] bool QObject::disconnect(const QMetaObject::Connection &connection)

연결을 끊습니다.

connection 주소가 유효하지 않거나 이미 연결이 끊어진 경우 아무 작업도 수행하지 않고 false를 반환합니다.

connect()도 참조하세요 .

[static] bool QObject::disconnect(const QObject *sender, const QMetaMethod &signal, const QObject *receiver, const QMetaMethod &method)

객체 sendermethod 에서 객체 receiversignal 연결을 끊습니다. 연결이 성공적으로 끊어지면 true 을 반환하고, 그렇지 않으면 false 을 반환합니다.

이 함수는 disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method) 과 동일한 가능성을 제공하지만 QMetaMethod 을 사용하여 연결을 끊을 신호와 메서드를 나타냅니다.

또한 이 함수는 다음과 같은 경우 거짓을 반환하고 연결이 끊어진 신호와 슬롯이 없습니다:

  1. signal 발신자 클래스 또는 그 부모 클래스의 멤버가 아닌 경우.
  2. method 수신자 클래스 또는 그 부모 클래스의 멤버가 아닌 경우.
  3. signal 인스턴스는 신호가 아님을 나타냅니다.

참고: SIGNALSLOT 매크로를 사용하여 포인터-멤버-함수 또는 문자열 기반의 동일한 구문을 connect() 및 해당 disconnect() 호출에 사용하세요.

불일치를 방지하려면 connect()에서 반환한 연결 핸들을 저장하고 disconnect() 호출에 사용하세요.

참고: queued connection 연결이 끊어져도 이미 예약된 이벤트가 계속 전달되어 연결이 끊어진 후 수신자가 호출될 수 있습니다.

QMetaMethod()는 "모든 신호" 또는 "수신 객체의 모든 슬롯"이라는 의미로 와일드카드로 사용할 수 있습니다. 같은 방식으로 nullptr 는 "모든 수신 객체"라는 의미로 receiver 에 사용할 수 있습니다. 이 경우 메서드도 QMetaMethod()여야 합니다. sender 매개변수는 절대 nullptr 이 아니어야 합니다.

참고: 모든 신호 슬롯 연결을 끊으면 QObject::destroyed() 신호가 연결되어 있는 경우에도 연결이 끊어집니다. 이렇게 하면 리소스 정리를 위해 이 신호에 의존하는 클래스에 부정적인 영향을 미칠 수 있습니다. 애플리케이션 코드에 의해 연결된 특정 신호만 연결을 해제하는 것이 좋습니다.

disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)도 참조하세요 .

[static] bool QObject::disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)

객체 sendermethod 에서 객체 receiversignal 연결을 끊습니다. 연결이 성공적으로 끊어지면 true 을 반환하고, 그렇지 않으면 false 을 반환합니다.

관련된 객체 중 하나가 파괴되면 신호 슬롯 연결이 제거됩니다.

disconnect()는 일반적으로 다음 예시에서 볼 수 있듯이 세 가지 방식으로 사용됩니다.

  1. 객체의 신호에 연결된 모든 연결을 끊습니다:
    disconnect(myObject, nullptr, nullptr, nullptr);

    비정적 오버로드 함수와 동일하게

    myObject->disconnect();
  2. 특정 신호에 연결된 모든 것을 연결 해제합니다:
    disconnect(myObject, SIGNAL(mySignal()), nullptr, nullptr);

    비정적 과부하 기능과 동등함.

    myObject->disconnect(SIGNAL(mySignal()));
  3. 특정 수신기 연결 해제:
    disconnect(myObject, nullptr, myReceiver, nullptr);

    비정적 과부하 기능과 동등함

    myObject->disconnect(myReceiver);

참고: SIGNALSLOT 매크로를 사용하여 connect() 및 해당 disconnect() 호출에서 동일한 구문, 포인터-멤버 함수 또는 문자열 기반 구문을 사용합니다.

불일치를 방지하려면 connect()에서 반환한 연결 핸들을 저장하고 disconnect() 호출에 사용하세요.

참고: queued connection 연결이 끊어져도 이미 예약된 이벤트가 계속 전달되어 연결이 끊어진 후 수신자가 호출될 수 있습니다.

nullptr 는 각각 "모든 신호", "모든 수신 대상" 또는 "수신 대상의 모든 슬롯"을 의미하는 와일드카드로 사용할 수 있습니다.

sendernullptr 이 될 수 없습니다(한 번의 호출로 두 개 이상의 객체에서 신호 연결을 끊을 수 없습니다).

signalnullptr 인 경우 receivermethod 을 모든 신호에서 연결 해제합니다. 그렇지 않으면 지정된 신호만 연결이 끊어집니다.

receivernullptr 인 경우 signal 에 연결된 모든 연결을 끊습니다. 그렇지 않은 경우 receiver 이외의 객체의 슬롯은 연결이 끊어지지 않습니다.

methodnullptr 인 경우 receiver 에 연결된 모든 것을 연결 해제합니다. 그렇지 않은 경우 method 라는 이름의 슬롯만 연결 해제되고 다른 모든 슬롯은 그대로 유지됩니다. receiver 이 빠진 경우 methodnullptr 이어야 하므로 모든 개체의 특정 이름의 슬롯을 연결 해제할 수 없습니다.

참고: 모든 신호 슬롯 연결을 끊으면 QObject::destroyed() 신호가 연결되어 있는 경우에도 연결이 끊어집니다. 이렇게 하면 리소스 정리를 위해 이 신호에 의존하는 클래스에 부정적인 영향을 미칠 수 있습니다. 애플리케이션 코드에 의해 연결된 특정 신호만 연결을 해제하는 것이 좋습니다.

참고: 이 함수는 스레드에 안전합니다.

connect()도 참조하세요 .

bool QObject::disconnect(const QObject *receiver, const char *method = nullptr) const

이 함수는 disconnect()를 오버로드합니다.

receivermethod 에서 이 객체의 모든 신호 연결을 끊습니다.

참고: SIGNALSLOT 매크로를 사용하여 포인터-멤버 함수 또는 문자열 기반의 동일한 구문을 connect() 및 해당 disconnect() 호출에 사용하세요.

불일치를 방지하려면 connect()에서 반환한 연결 핸들을 저장하고 disconnect() 호출에 사용하세요.

참고: queued connection 연결이 끊어져도 이미 예약된 이벤트가 계속 전달되어 연결이 끊어진 후 수신자가 호출될 수 있습니다.

관련된 객체 중 하나가 파괴되면 신호 슬롯 연결이 제거됩니다.

bool QObject::disconnect(const char *signal = nullptr, const QObject *receiver = nullptr, const char *method = nullptr) const

이 함수는 disconnect()에 과부하를 줍니다.

receivermethod 에서 signal 의 연결을 끊습니다.

참고: SIGNALSLOT 매크로를 사용하여 connect() 및 해당 disconnect() 호출에서 동일한 구문, 포인터-멤버 함수 또는 문자열 기반 구문을 사용합니다.

불일치를 방지하려면 connect()에서 반환한 연결 핸들을 저장하고 disconnect() 호출에 사용하세요.

참고: queued connection 연결이 끊어져도 이미 예약된 이벤트가 계속 전달되어 연결이 끊어진 후 수신자가 호출될 수 있습니다.

관련된 객체 중 하나가 파괴되면 신호 슬롯 연결이 제거됩니다.

참고: 모든 신호 슬롯 연결을 끊으면 QObject::destroyed() 신호가 연결되어 있는 경우에도 연결이 끊어집니다. 이렇게 하면 리소스 정리를 위해 이 신호에 의존하는 클래스에 부정적인 영향을 미칠 수 있습니다. 애플리케이션 코드에 의해 연결된 특정 신호만 연결을 해제하는 것이 좋습니다.

참고: 이 함수는 스레드에 안전합니다.

[static] template <typename PointerToMemberFunction> bool QObject::disconnect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method)

이 함수는 disconnect()를 오버로드합니다.

sender 객체의 method 에서 receiver 객체의 signal 연결을 끊습니다. 연결이 성공적으로 끊어지면 true 을 반환하고, 그렇지 않으면 false 을 반환합니다.

관련된 객체 중 하나가 파괴되면 신호 슬롯 연결이 제거됩니다.

disconnect()는 일반적으로 다음 예시에서 볼 수 있듯이 세 가지 방식으로 사용됩니다.

  1. 객체의 신호에 연결된 모든 연결을 끊습니다:
    disconnect(myObject, nullptr, nullptr, nullptr);
  2. 특정 신호에 연결된 모든 연결을 끊습니다:
    disconnect(myObject, &MyObject::mySignal(), nullptr, nullptr);
  3. 특정 수신기 연결 해제: 특정 수신기 연결 해제:
    disconnect(myObject, nullptr, myReceiver, nullptr);
  4. 특정 신호에서 특정 슬롯으로 연결된 연결을 끊습니다:
    QObject::disconnect(lineEdit, &QLineEdit::textChanged,
                     label,  &QLabel::setText);

nullptr 는 각각 "모든 신호", "모든 수신 대상" 또는 "수신 대상의 모든 슬롯"을 의미하는 와일드카드로 사용할 수 있습니다.

sendernullptr 이 될 수 없습니다(한 번의 호출로 두 개 이상의 객체에서 신호를 끊을 수 없습니다).

signalnullptr 인 경우 receivermethod 을 모든 신호에서 연결 해제합니다. 그렇지 않으면 지정된 신호만 연결이 끊어집니다.

receivernullptr 인 경우 signal 에 연결된 모든 연결을 끊습니다. 그렇지 않은 경우 지정된 수신기의 슬롯만 연결이 끊어집니다. disconnect()에 널이 아닌 receiver 을 사용하면 컨텍스트 객체로 receiver 와 연결되었던 슬롯 함수도 연결이 끊어집니다.

methodnullptr 인 경우 receiver 에 연결된 모든 슬롯의 연결을 끊습니다. 그렇지 않은 경우 method 라는 이름의 슬롯만 연결이 끊어지고 다른 모든 슬롯은 그대로 유지됩니다. receiver 이 생략된 경우 methodnullptr 이어야 하므로 모든 개체의 특정 이름의 슬롯을 연결 해제할 수 없습니다.

참고: 이 오버로드를 사용하여 함수나 람다 표현식에 연결된 신호의 연결을 끊을 수는 없습니다. 비교가 불가능하기 때문입니다. 대신 QMetaObject::Connection 을 취하는 오버로드를 사용하세요.

참고: methodnullptr 이 아니라면 이 함수는 connect()의 문자열 기반 버전을 사용하여 만든 연결도 끊지 않습니다. 이러한 연결을 끊으려면 해당 문자열 기반 disconnect()의 오버로드를 사용하세요.

참고: 이 함수는 스레드에 안전합니다.

connect()도 참조하세요 .

[virtual protected] void QObject::disconnectNotify(const QMetaMethod &signal)

이 가상 함수는 이 객체에서 signal 에서 연결이 끊어졌을 때 호출됩니다.

signal 을 특정 신호와 비교하는 방법에 대한 예는 connectNotify()를 참조하세요.

이 객체에서 모든 신호가 연결이 끊어진 경우(예: disconnect()의 신호 인수가 nullptr), disconnectNotify()는 한 번만 호출되고 signal 는 잘못된 QMetaMethod (QMetaMethod::isValid()는 false)를 반환합니다.

경고: 이 함수는 객체 지향의 모듈화 원칙을 위반합니다. 그러나 값비싼 리소스에 대한 액세스를 최적화하는 데는 유용할 수 있습니다.

경고: 이 함수는 연결 해제를 수행하는 스레드에서 호출되며, 이 스레드는 이 객체가 있는 스레드와 다른 스레드일 수 있습니다. 이 함수는 QObject 내부 뮤텍스가 잠긴 상태에서도 호출될 수 있습니다. 따라서 isSignalConnected()을 포함한 QObject 함수를 재구현할 때 다시 입력할 수 없습니다. 재구현에서 뮤텍스를 잠그면 다른 곳에서 해당 뮤텍스가 잠긴 상태에서 QObject 함수를 호출하지 않으면 교착 상태가 발생할 수 있습니다.

disconnect() 및 connectNotify()도 참조하세요 .

void QObject::dumpObjectInfo() const

이 객체에 대한 신호 연결 등에 대한 정보를 디버그 출력에 덤프합니다.

참고: Qt 5.9 이전에는, 이 함수는 const가 아니었습니다.

dumpObjectTree()도 참조하십시오 .

void QObject::dumpObjectTree() const

자식 트리를 디버그 출력에 덤프합니다.

참고: Qt 5.9 이전에는 이 함수가 const가 아니었습니다.

dumpObjectInfo()도 참조하십시오 .

QList<QByteArray> QObject::dynamicPropertyNames() const

setProperty()를 사용하여 객체에 동적으로 추가한 모든 프로퍼티의 이름을 반환합니다.

[virtual] bool QObject::event(QEvent *e)

이 가상 함수는 객체에 대한 이벤트를 수신하고 e 이벤트가 인식되어 처리된 경우 true를 반환해야 합니다.

event() 함수를 다시 구현하여 객체의 동작을 사용자 지정할 수 있습니다.

처리하지 않은 모든 이벤트에 대해 상위 이벤트 클래스 구현을 호출해야 합니다.

예시:

class MyClass : public QWidget
{
    Q_OBJECT

public:
    MyClass(QWidget *parent = nullptr);
    ~MyClass();

    bool event(QEvent* ev) override
    {
        if (ev->type() == QEvent::PolishRequest) {
            // overwrite handling of PolishRequest if any
            doThings();
            return true;
        } else  if (ev->type() == QEvent::Show) {
            // complement handling of Show if any
            doThings2();
            QWidget::event(ev);
            return true;
        }
        // Make sure the rest of events are handled
        return QWidget::event(ev);
    }
};

installEventFilter(), timerEvent(), QCoreApplication::sendEvent() 및 QCoreApplication::postEvent()도 참조하세요 .

[virtual] bool QObject::eventFilter(QObject *watched, QEvent *event)

이 개체가 watched 개체에 대한 이벤트 필터로 설치된 경우 이벤트를 필터링합니다.

이 함수를 다시 구현할 때 event 을 필터링하여 더 이상 처리되지 않도록 하려면 참을 반환하고, 그렇지 않으면 거짓을 반환합니다.

예시:

class MainWindow : public QMainWindow
{public: MainWindow();protected: bool eventFilter(QObject*obj, QEvent *ev) override;private:    QTextEdit *textEdit; }; MainWindow::MainWindow() { textEdit = new QTextEdit; setCentralWidget(textEdit);  textEdit->installEventFilter(this); }bool MainWindow::eventFilter(QObject*obj, QEvent *event) { if (obj== textEdit) { if (event->type()== QEvent::KeyPress) { QKeyEvent *keyEvent =  static_cast<QKeyEvent*>(event);            qDebug() << "Ate key press" << keyEvent->key();
           반환 ; } else { 반환 거짓; } } else { // 이벤트를 부모 클래스에 전달 반환 QMainWindow::eventFilter(obj, event); } }

위 예제에서 처리되지 않은 이벤트가 베이스 클래스의 eventFilter() 함수로 전달되는 것을 볼 수 있는데, 이는 베이스 클래스가 자체 내부 용도로 eventFilter()를 재구현했을 수 있기 때문입니다.

QEvent::ShortcutOverride 같은 일부 이벤트는 전파를 방지하기 위해 accept()를 호출하여 명시적으로 수락해야 합니다.

경고: 이 함수에서 수신자 객체를 삭제하는 경우 반드시 참을 반환해야 합니다. 그렇지 않으면 Qt가 삭제된 객체로 이벤트를 전달하여 프로그램이 충돌할 수 있습니다.

installEventFilter()도 참조하십시오 .

template <typename T> T QObject::findChild(QAnyStringView name, Qt::FindChildOptions options = Qt::FindChildrenRecursively) const

이 객체의 자식 중 T형으로 형변환할 수 있고 name 또는 그러한 객체가 없는 경우 nullptr 을 반환합니다. null name 인수는 모든 객체를 일치시킵니다. 널이 아닌 비어 있는 nameobjectName 이 비어 있는 객체만 일치시킵니다. options 에서 FindDirectChildrenOnly 옵션을 지정하지 않는 한 검색은 재귀적으로 수행됩니다.

검색과 일치하는 자식이 두 개 이상 있는 경우 가장 직접적인 조상이 반환됩니다. 가장 직계 자식이 여러 개 있는 경우 children()의 첫 번째 자식이 반환됩니다. 이 경우 findChildren()를 사용하여 모든 하위 항목의 전체 목록을 가져오는 것이 좋습니다.

이 예에서는 버튼이 부모의 직계 자식이 아니더라도 parentWidget"button1" 라는 자식 QPushButton 을 반환합니다:

QPushButton *button = parentWidget->findChild<QPushButton *>("button1");

이 예는 parentWidgetQListWidget 자식을 반환합니다:

QListWidget *list = parentWidget->findChild<QListWidget *>();

이 예는 parentWidget (직접 부모)의 "button1" 라는 이름의 QPushButton 자식을 반환합니다:

QPushButton *button = parentWidget->findChild<QPushButton *>("button1", Qt::FindDirectChildrenOnly);

이 예는 직접 부모인 parentWidgetQListWidget 자식을 반환합니다:

QListWidget *list = parentWidget->findChild<QListWidget *>(Qt::FindDirectChildrenOnly);

참고: 6.7 이전 Qt 버전에서 이 함수는 nameQAnyStringView 가 아닌 QString 로 취했습니다.

findChildren()도 참조하십시오 .

[since 6.7] template <typename T> T QObject::findChild(Qt::FindChildOptions options = Qt::FindChildrenRecursively) const

이 함수는 오버로드된 함수입니다.

T 유형으로 형변환할 수 있는 이 객체의 자식을 반환하거나, 그러한 객체가 없는 경우 nullptr 을 반환합니다. options 에서 FindDirectChildrenOnly 옵션을 지정하지 않는 한 검색은 재귀적으로 수행됩니다.

검색과 일치하는 자식이 두 개 이상 있는 경우 가장 직접적인 조상이 반환됩니다. 가장 직계 자식이 여러 개 있는 경우 children()의 첫 번째 자식이 반환됩니다. 이 경우 findChildren()를 사용하여 모든 자식의 전체 목록을 가져오는 것이 좋습니다.

이 함수는 Qt 6.7에 도입되었습니다.

findChildren()도 참조하세요 .

template <typename T> QList<T> QObject::findChildren(QAnyStringView name, Qt::FindChildOptions options = Qt::FindChildrenRecursively) const

이 객체의 모든 자식 중 T 타입으로 형 변환할 수 있는 name 을 반환하거나, 그러한 객체가 없는 경우 빈 리스트를 반환합니다. name 인수가 널이면 모든 객체가 일치하고, 빈이면 objectName 이 비어 있는 객체만 일치합니다. options 에서 FindDirectChildrenOnly 옵션을 지정하지 않는 한 검색은 재귀적으로 수행됩니다.

다음 예는 지정된 parentWidget 이라는 이름의 widgetname 의 하위 QWidget목록을 찾는 방법을 보여줍니다:

QList<QWidget *> widgets = parentWidget.findChildren<QWidget *>("widgetname");

이 예는 parentWidget 의 자식인 모든 QPushButton을 반환합니다:

QList<QPushButton *> allPButtons = parentWidget.findChildren<QPushButton *>();

이 예는 parentWidget 의 직계 자식인 QPushButton을 모두 반환합니다:

QList<QPushButton *> childButtons = parentWidget.findChildren<QPushButton *>(Qt::FindDirectChildrenOnly);

참고: 6.7 이전 Qt 버전에서 이 함수는 nameQAnyStringView 이 아닌 QString 으로 취했습니다.

findChild()도 참조하십시오 .

[since 6.3] template <typename T> QList<T> QObject::findChildren(Qt::FindChildOptions options = Qt::FindChildrenRecursively) const

이것은 오버로드된 함수입니다.

이 객체의 모든 자식 중 T형으로 형변환할 수 있는 객체를 반환하거나, 그러한 객체가 없는 경우 빈 목록을 반환합니다. options 에서 FindDirectChildrenOnly 옵션을 지정하지 않는 한 검색은 재귀적으로 수행됩니다.

이 함수는 Qt 6.3에 도입되었습니다.

findChild()도 참조하십시오 .

template <typename T> QList<T> QObject::findChildren(const QRegularExpression &re, Qt::FindChildOptions options = Qt::FindChildrenRecursively) const

이 함수는 findChildren()을 오버로드합니다.

이 객체의 자식 중 T 유형으로 캐스팅할 수 있고 정규식 re 과 일치하는 이름을 가진 객체를 반환하거나 그러한 객체가 없는 경우 빈 목록을 반환합니다. options 에서 FindDirectChildrenOnly 옵션을 지정하지 않는 한 검색은 재귀적으로 수행됩니다.

bool QObject::inherits(const char *className) const

className이 객체가 className 을 상속하는 클래스의 인스턴스이거나 QObject 을 상속하는 서브클래스인 경우 true 을 반환하고, 그렇지 않으면 false 을 반환합니다.

클래스는 자신을 상속하는 것으로 간주됩니다.

예시:

QTimer *timer = new QTimer;         // QTimer inherits QObject
timer->inherits("QTimer");          // returns true
timer->inherits("QObject");         // returns true
timer->inherits("QAbstractButton"); // returns false

// QVBoxLayout inherits QObject and QLayoutItem
QVBoxLayout *layout = new QVBoxLayout;
layout->inherits("QObject");        // returns true
layout->inherits("QLayoutItem");    // returns true (even though QLayoutItem is not a QObject)

객체를 캐스팅하기 위해 객체가 특정 클래스의 인스턴스인지 확인해야 하는 경우 qobject_cast<Type *>(object)를 대신 사용하는 것이 좋습니다.

metaObject() 및 qobject_cast()도 참조하세요 .

void QObject::installEventFilter(QObject *filterObj)

이 개체에 이벤트 필터 filterObj 를 설치합니다. 예를 들어

monitoredObj->installEventFilter(filterObj);

이벤트 필터는 이 개체로 전송되는 모든 이벤트를 수신하는 개체입니다. 필터는 이벤트를 중지하거나 이 개체로 전달할 수 있습니다. 이벤트 필터 filterObjeventFilter() 함수를 통해 이벤트를 수신합니다. eventFilter () 함수는 이벤트를 필터링(즉, 중지)해야 하는 경우 참을 반환해야 하며, 그렇지 않으면 거짓을 반환해야 합니다.

하나의 개체에 여러 개의 이벤트 필터가 설치되어 있는 경우 가장 마지막에 설치된 필터가 먼저 활성화됩니다.

filterObj 이 개체에 대해 이미 설치되어 있는 경우 이 함수는 이 개체를 이동하여 마지막에 설치된 것처럼 작동합니다.

다음은 모니터링되는 객체의 키 누름을 수집하는 KeyPressEater 클래스입니다:

class KeyPressEater : public QObject
{ Q_OBJECT .. .protected: bool eventFilter(QObject*obj, QEvent *event) override; };bool KeyPressEater::eventFilter(QObject*obj, QEvent *event) { if (event->type()==. QEvent::KeyPress) { QKeyEvent *keyEvent =  static_cast<QKeyEvent *>(event);        qDebug("Ate key press %d", keyEvent->key());
       return true; } else { // 표준 이벤트 처리 반환 QObject::eventFilter(obj, event); } }

두 위젯에 설치하는 방법은 다음과 같습니다:

KeyPressEater *keyPressEater = new KeyPressEater(this);
QPushButton *pushButton = new QPushButton(this);
QListView *listView = new QListView(this);

pushButton->installEventFilter(keyPressEater);
listView->installEventFilter(keyPressEater);

예를 들어 QShortcut 클래스는 이 기술을 사용하여 단축키 누름을 가로챕니다.

경고: eventFilter () 함수에서 수신자 객체를 삭제하는 경우 반드시 참을 반환해야 합니다. 거짓을 반환하면 Qt가 삭제된 객체로 이벤트를 전송하고 프로그램이 충돌합니다.

필터링 객체는 이 객체와 동일한 스레드에 있어야 합니다. filterObj 이 다른 스레드에 있으면 이 함수는 아무 작업도 수행하지 않습니다. 이 함수를 호출한 후 filterObj 또는 이 객체가 다른 스레드로 이동하면 두 객체가 다시 동일한 스레드 선호도를 가질 때까지 이벤트 필터가 호출되지 않습니다( 제거되지 않음 ).

removeEventFilter(), eventFilter() 및 event()도 참조하세요 .

[since 6.4] bool QObject::isQuickItemType() const

객체가 QQuickItem 인 경우 true 을 반환하고, 그렇지 않으면 false 을 반환합니다.

이 함수를 호출하는 것은 inherits("QQuickItem") 을 호출하는 것과 동일하지만 훨씬 빠릅니다.

이 함수는 Qt 6.4에 도입되었습니다.

[protected] bool QObject::isSignalConnected(const QMetaMethod &signal) const

signal 이 하나 이상의 수신기에 연결되어 있으면 true 을 반환하고, 그렇지 않으면 false 을 반환합니다.

signal 는 이 객체의 시그널 멤버여야 하며, 그렇지 않으면 동작이 정의되지 않습니다.

static const QMetaMethod valueChangedSignal = QMetaMethod::fromSignal(&MyObject::valueChanged);
if (isSignalConnected(valueChangedSignal)) {
    QByteArray data;
    data = get_the_value();       // expensive operation
    emit valueChanged(data);
}

위의 코드 스니펫에서 볼 수 있듯이 이 함수를 사용하면 초기화 비용이 많이 들거나 아무도 듣지 않는 신호를 방출하는 것을 피할 수 있습니다. 그러나 멀티스레드 애플리케이션에서는 이 함수가 반환된 후 신호가 방출되기 전에 연결이 변경될 수 있습니다.

경고: 이 함수는 객체 지향 모듈성 원칙을 위반합니다. 특히 이 함수는 모든 스레드에서 호출될 수 있으므로 connectNotify() 또는 disconnectNotify()의 오버라이드에서 호출해서는 안 됩니다.

bool QObject::isWidgetType() const

객체가 위젯인 경우 true 을 반환하고, 그렇지 않으면 false 을 반환합니다.

이 함수를 호출하는 것은 inherits("QWidget") 을 호출하는 것과 동일하지만 훨씬 빠릅니다.

bool QObject::isWindowType() const

객체가 창인 경우 true 을 반환하고, 그렇지 않으면 false 을 반환합니다.

이 함수를 호출하는 것은 inherits("QWindow") 을 호출하는 것과 동일하지만 훨씬 빠릅니다.

void QObject::killTimer(int id)

타이머 식별자 id 로 타이머를 종료합니다.

타이머 식별자는 타이머 이벤트가 시작되면 startTimer()에 의해 반환됩니다.

timerEvent() 및 startTimer()도 참조하세요 .

[since 6.8] void QObject::killTimer(Qt::TimerId id)

이 함수는 오버로드된 함수입니다.

이 함수는 Qt 6.8에 도입되었습니다.

[virtual] const QMetaObject *QObject::metaObject() const

이 객체의 메타 객체에 대한 포인터를 반환합니다.

메타 객체에는 클래스 이름, 슈퍼클래스 이름, 속성, 시그널 및 슬롯 등 QObject 을 상속하는 클래스에 대한 정보가 포함됩니다. Q_OBJECT 매크로를 포함하는 모든 QObject 하위 클래스에는 메타 객체가 있습니다.

메타 객체 정보는 신호/슬롯 연결 메커니즘과 프로퍼티 시스템에서 필요합니다. inherits () 함수 역시 메타 객체를 사용합니다.

실제 객체 인스턴스에 대한 포인터가 없지만 클래스의 메타 객체에 액세스하려는 경우 staticMetaObject 을 사용할 수 있습니다.

예시:

QObject *obj = new QPushButton;
obj->metaObject()->className();             // returns "QPushButton"

QPushButton::staticMetaObject.className();  // returns "QPushButton"

staticMetaObject참조하세요 .

bool QObject::moveToThread(QThread *targetThread)

이 객체와 그 자식에 대한 스레드 선호도를 변경하고 성공하면 true 을 반환합니다. 객체에 부모가 있는 경우 객체를 이동할 수 없습니다. 이벤트 처리는 targetThread 에서 계속됩니다.

개체를 메인 스레드로 이동하려면 QApplication::instance()를 사용하여 현재 애플리케이션에 대한 포인터를 검색한 다음 QApplication::thread()를 사용하여 애플리케이션이 있는 스레드를 검색합니다. 예를 들어

myObject->moveToThread(QApplication::instance()->thread());

targetThreadnullptr 인 경우 이 객체와 그 자식에 대한 모든 이벤트 처리는 더 이상 스레드와 연결되지 않으므로 중지됩니다.

개체에 대한 모든 활성 타이머가 재설정됩니다. 타이머는 먼저 현재 스레드에서 중지되었다가 targetThread 에서 동일한 간격으로 다시 시작됩니다. 따라서 스레드 간에 개체를 계속 이동하면 타이머 이벤트가 무기한 연기될 수 있습니다.

스레드 선호도가 변경되기 직전에 QEvent::ThreadChange 이벤트가 이 객체로 전송됩니다. 이 이벤트를 처리하여 특별한 처리를 수행할 수 있습니다. 이 객체에 게시되는 모든 새 이벤트는 nullptr 이 아닌 경우 targetThread 에서 처리되며, nullptr 인 경우 더 이상 스레드와 연결되지 않으므로 이 객체 또는 그 자식에 대한 이벤트 처리가 이루어질 수 없음을 유의하세요.

경고: 이 함수는 스레드 안전하지 않으며, 현재 스레드가 현재 스레드 선호도와 동일해야 합니다. 즉, 이 함수는 현재 스레드에서 다른 스레드로만 객체를 '푸시'할 수 있으며 임의의 스레드에서 현재 스레드로 객체를 '풀'할 수는 없습니다. 그러나 이 규칙에는 한 가지 예외가 있습니다. 스레드 선호도가 없는 객체를 현재 스레드로 "끌어올" 수 있습니다.

thread()도 참조하세요 .

[private signal] void QObject::objectNameChanged(const QString &objectName)

이 신호는 객체의 이름이 변경된 후에 발생합니다. 새 객체 이름은 objectName 로 전달됩니다.

참고: 이 신호는 비공개 신호입니다. 신호 연결에서 사용할 수 있지만 사용자가 발신할 수는 없습니다.

참고: 속성에 대한 알림 신호 objectName.

QObject::objectName도 참조하세요 .

QObject *QObject::parent() const

부모 객체에 대한 포인터를 반환합니다.

setParent() 및 children()도 참조하세요 .

QVariant QObject::property(const char *name) const

객체의 name 속성 값을 반환합니다.

해당 프로퍼티가 존재하지 않으면 반환된 변형은 유효하지 않습니다.

사용 가능한 모든 프로퍼티에 대한 정보는 metaObject() 및 dynamicPropertyNames()를 통해 제공됩니다.

setProperty(), QVariant::isValid(), metaObject() 및 dynamicPropertyNames()도 참조하세요 .

[protected] int QObject::receivers(const char *signal) const

signal 에 연결된 수신기 수를 반환합니다.

슬롯과 신호 모두 신호의 수신기로 사용할 수 있고 동일한 연결을 여러 번 할 수 있으므로 수신기 수는 이 신호의 연결 수와 동일합니다.

이 함수를 호출할 때 SIGNAL() 매크로를 사용하여 특정 신호를 전달할 수 있습니다:

if (receivers(SIGNAL(valueChanged(QByteArray))) > 0) {
    QByteArray data;
    get_the_value(&data);       // expensive operation
    emit valueChanged(data);
}

경고: 이 함수는 객체 지향의 모듈화 원칙을 위반합니다. 하지만 신호에 연결된 경우에만 값비싼 초기화를 수행해야 할 때 유용할 수 있습니다.

isSignalConnected()도 참조하세요 .

void QObject::removeEventFilter(QObject *obj)

이 개체에서 이벤트 필터 개체 obj 를 제거합니다. 해당 이벤트 필터가 설치되지 않은 경우 요청은 무시됩니다.

이 개체가 삭제되면 이 개체에 대한 모든 이벤트 필터가 자동으로 제거됩니다.

이벤트 필터 활성화 중(예: eventFilter() 함수에서)에도 이벤트 필터를 제거하는 것이 항상 안전합니다.

installEventFilter(), eventFilter() 및 event()도 참조하세요 .

[protected] QObject *QObject::sender() const

신호에 의해 활성화된 슬롯에서 호출된 경우 신호를 보낸 객체에 대한 포인터를 반환하고, 그렇지 않으면 nullptr 을 반환합니다. 포인터는 이 객체의 스레드 컨텍스트에서 이 함수를 호출하는 슬롯이 실행되는 동안에만 유효합니다.

발신자가 소멸되거나 슬롯이 발신자의 신호에서 연결이 끊어지면 이 함수가 반환하는 포인터는 유효하지 않게 됩니다.

경고: 이 함수는 객체 지향 모듈성 원칙을 위반합니다. 하지만 하나의 슬롯에 많은 신호가 연결되어 있는 경우 발신자에 대한 액세스 권한을 얻는 것이 유용할 수 있습니다.

경고: 위에서 언급했듯이 이 함수의 반환 값은 이 객체의 스레드와 다른 스레드에서 Qt::DirectConnection 을 통해 슬롯을 호출하는 경우 유효하지 않습니다. 이러한 유형의 시나리오에서는 이 함수를 사용하지 마세요.

senderSignalIndex()도 참조하세요 .

[protected] int QObject::senderSignalIndex() const

sender()가 반환하는 클래스의 멤버인 현재 실행 중인 슬롯을 호출한 신호의 메타 메서드 인덱스를 반환합니다. 신호에 의해 활성화된 슬롯 외부에서 호출되면 -1이 반환됩니다.

기본 매개변수가 있는 신호의 경우, 이 함수는 connect()와 함께 사용된 매개변수에 관계없이 항상 모든 매개변수가 포함된 인덱스를 반환합니다. 예를 들어 destroyed(QObject *obj = \nullptr) 신호는 매개변수가 있는 경우와 없는 경우 두 개의 다른 인덱스가 있지만 이 함수는 항상 매개변수가 있는 인덱스를 반환합니다. 다른 파라미터를 사용하여 신호를 오버로드할 때는 적용되지 않습니다.

경고: 이 함수는 객체 지향의 모듈화 원칙을 위반합니다. 하지만 하나의 슬롯에 많은 신호가 연결되어 있는 경우 신호 인덱스에 액세스하는 것이 유용할 수 있습니다.

경고: 이 함수의 반환 값은 이 객체의 스레드와 다른 스레드에서 Qt::DirectConnection 을 통해 슬롯을 호출하는 경우 유효하지 않습니다. 이러한 유형의 시나리오에서는 이 함수를 사용하지 마세요.

sender(), QMetaObject::indexOfSignal() 및 QMetaObject::method()도 참조하세요 .

void QObject::setObjectName(const QString &name)

객체의 이름을 name 로 설정합니다.

참고: 속성에 대한 세터 함수 objectName.

objectName()도 참조하세요 .

[since 6.4] void QObject::setObjectName(QAnyStringView name)

이 함수는 오버로드된 함수입니다.

참고: 속성 설정자 함수 objectName.

이 함수는 Qt 6.4에 도입되었습니다.

void QObject::setParent(QObject *parent)

객체를 parent 의 자식으로 만듭니다.

parent() 및 children()도 참조하세요 .

bool QObject::setProperty(const char *name, const QVariant &value)

객체의 name 속성 값을 value 으로 설정합니다.

속성이 Q_PROPERTY 을 사용하여 클래스에서 정의된 경우 성공하면 참을 반환하고 그렇지 않으면 거짓을 반환합니다. 속성이 Q_PROPERTY 를 사용하여 정의되지 않아 메타 객체에 나열되지 않은 경우 동적 속성으로 추가되고 false가 반환됩니다.

사용 가능한 모든 속성에 대한 정보는 metaObject() 및 dynamicPropertyNames()을 통해 제공됩니다.

동적 속성은 property()를 사용하여 다시 쿼리할 수 있으며 속성 값을 유효하지 않은 QVariant 으로 설정하여 제거할 수 있습니다. 동적 속성 값을 변경하면 QDynamicPropertyChangeEvent 이 개체에 전송됩니다.

참고: "_q_"로 시작하는 동적 프로퍼티는 내부용으로 예약되어 있습니다.

property(), metaObject(), dynamicPropertyNames() 및 QMetaProperty::write()도 참조하세요 .

[since 6.6] bool QObject::setProperty(const char *name, QVariant &&value)

이 함수는 setProperty를 오버로드합니다.

이 함수는 Qt 6.6에 도입되었습니다.

[noexcept] bool QObject::signalsBlocked() const

신호가 차단된 경우 true 을 반환하고, 그렇지 않으면 false 을 반환합니다.

신호는 기본적으로 차단되지 않습니다.

blockSignals() 및 QSignalBlocker참조하세요 .

int QObject::startTimer(int interval, Qt::TimerType timerType = Qt::CoarseTimer)

이것은 timerType 유형의 타이머와 interval 밀리초의 타임아웃을 시작하는 오버로드된 함수입니다. 이는 호출과 동일합니다:

startTimer(std::chrono::milliseconds{interval}, timerType);

timerEvent(), killTimer(), QChronoTimer, 및 QBasicTimer도 참조하세요 .

int QObject::startTimer(std::chrono::nanoseconds interval, Qt::TimerType timerType = Qt::CoarseTimer)

과부하가 걸린 기능입니다.

타이머를 시작하고 타이머 식별자를 반환하거나 타이머를 시작할 수 없는 경우 0을 반환합니다.

타이머 이벤트는 killTimer()가 호출될 때까지 매 interval 마다 발생합니다. intervalstd::chrono::duration::zero() 과 같으면 처리할 창 시스템 이벤트가 더 이상 없을 때마다 타이머 이벤트가 한 번씩 발생합니다.

가상 timerEvent() 함수는 타이머 이벤트가 발생하면 QTimerEvent 이벤트 매개변수 클래스와 함께 호출됩니다. 타이머 이벤트를 가져오려면 이 함수를 다시 구현하세요.

여러 타이머가 실행 중인 경우 QTimerEvent::id() 메서드를 사용하여 어떤 타이머가 활성화되었는지 확인할 수 있습니다.

예시:

class MyObject : public QObject
{ Q_OBJECTpublic: MyObject(QObject *parent = nullptr);protected: void timerEvent(QTimerEvent *event) override; }; MyObject::MyObject(QObject *부모) : QObject(parent) { using namespace std::chrono_literals; startTimer(50ms); startTimer(5s); startTimer(10min); startTimer(1h); }void MyObject::timerEvent(QTimerEvent *event){
    qDebug() << "Timer ID:" << event->id();

타이머의 정확도는 기본 운영 체제 및 하드웨어에 따라 달라질 수 있습니다.

timerType 인수를 사용하면 타이머의 정확도를 사용자 지정할 수 있습니다. 다양한 타이머 유형에 대한 자세한 내용은 Qt::TimerType 을 참조하세요. 대부분의 플랫폼은 20밀리초의 정확도를 지원하며, 일부 플랫폼은 더 높은 정확도를 제공합니다. Qt가 요청된 타이머 이벤트 수를 전달할 수 없는 경우, 일부 이벤트는 자동으로 삭제됩니다.

QTimerQChronoTimer 클래스는 이벤트 대신 싱글샷 타이머와 타이머 신호를 사용하는 높은 수준의 프로그래밍 인터페이스를 제공합니다. QChronoTimer 보다 더 가볍지만 타이머 ID를 직접 사용하는 것보다 덜 서투른 QBasicTimer 클래스도 있습니다.

참고: Qt 6.8부터 interval 의 유형은 std::chrono::nanoseconds 이며, 그 이전에는 std::chrono::milliseconds 이었습니다. 이 변경 사항은 이전 버전의 Qt와 역호환됩니다.

참고: Qt 6.8에서 QObject 은 타이머 ID를 나타내는 데 Qt::TimerId 을 사용하도록 변경되었습니다. 이 메서드는 이전 버전과의 호환성을 위해 TimerId 을 int 로 변환하지만, 예를 들어 Qt::TimerId 을 사용하여 이 메서드에서 반환된 값을 확인할 수 있습니다:

    QObject *obj;
    ...
    const auto id = Qt::TimerId{obj->startTimer(100ms)};
    if (id != Qt::TimerId::Invalid)
        // The timer has been started successfully

timerEvent(), killTimer(), QChronoTimer, 및 QBasicTimer도 참조하세요 .

QThread *QObject::thread() const

객체가 있는 스레드를 반환합니다.

moveToThread()도 참조하세요 .

[virtual protected] void QObject::timerEvent(QTimerEvent *event)

이 이벤트 핸들러는 서브클래스에서 재구현하여 객체에 대한 타이머 이벤트를 수신할 수 있습니다.

QChronoTimer 는 타이머 기능에 대한 상위 수준의 인터페이스와 타이머에 대한 보다 일반적인 정보를 제공합니다. 타이머 이벤트는 event 매개변수로 전달됩니다.

startTimer(), killTimer() 및 event()도 참조하세요 .

[static] QString QObject::tr(const char *sourceText, const char *disambiguation = nullptr, int n = -1)

선택적으로 disambiguation 문자열과 복수가 포함된 문자열의 경우 n 값을 기반으로 sourceText 의 번역 버전을 반환하고, 적절한 번역 문자열이 없는 경우 QString::fromUtf8(sourceText)을 반환합니다.

예:

void SpreadSheet::setupMenuBar()
{
    QMenu *fileMenu = menuBar()->addMenu(tr("&File"));
    ...

동일한 sourceText 이 동일한 컨텍스트 내에서 다른 역할에 사용되는 경우 추가 식별 문자열이 disambiguation (기본값은nullptr )으로 전달될 수 있습니다.

예:

MyWindow::MyWindow()
{
    QLabel *senderLabel = new QLabel(tr("Name:"));
    QLabel *recipientLabel = new QLabel(tr("Name:", "recipient"));
    ...

Qt의 번역 메커니즘 전반에 대한 자세한 설명은 번역을 위한 소스 코드 작성하기를, 모호성 해소에 대한 정보는 동일 텍스트 모호성 해 소를 참조하십시오.

경고: 이 메서드를 호출하기 전에 모든 번역기가 설치된 경우에만 이 메서드가 재진입합니다. 번역을 수행하는 동안 번역기를 설치하거나 제거하는 것은 지원되지 않습니다. 그렇게 하면 충돌이나 기타 바람직하지 않은 동작이 발생할 수 있습니다.

QCoreApplication::translate() 및 Qt XML로 국제화를참조하십시오 .

멤버 변수 문서

const QMetaObject QObject::staticMetaObject

이 변수는 클래스의 메타 객체를 저장합니다.

메타 객체에는 클래스 이름, 슈퍼클래스 이름, 속성, 시그널 및 슬롯 등 QObject 을 상속하는 클래스에 대한 정보가 포함됩니다. Q_OBJECT 매크로를 포함하는 모든 클래스에는 메타 객체도 있습니다.

메타 객체 정보는 신호/슬롯 연결 메커니즘과 프로퍼티 시스템에서 필요합니다. inherits () 함수 역시 메타 객체를 사용합니다.

객체에 대한 포인터가 있는 경우 metaObject()를 사용하여 해당 객체와 연결된 메타 객체를 검색할 수 있습니다.

예시:

QPushButton::staticMetaObject.className();  // returns "QPushButton"

QObject *obj = new QPushButton;
obj->metaObject()->className();             // returns "QPushButton"

metaObject()도 참조하세요 .

관련 비회원

template <typename T> T qobject_cast(QObject *object)

template <typename T> T qobject_cast(const QObject *object)

객체가 T 형(또는 서브 클래스)이면 주어진 object 형으로 형 변환을 반환하고, 그렇지 않으면 nullptr 을 반환합니다. objectnullptr 인 경우 nullptr 도 반환합니다.

T 클래스는 QObject 을 (직접 또는 간접적으로) 상속해야 하며 Q_OBJECT 매크로를 사용하여 선언해야 합니다.

클래스는 스스로 상속하는 것으로 간주됩니다.

예시:

QObject *obj = new QTimer;          // QTimer inherits QObject

QTimer *timer = qobject_cast<QTimer *>(obj);
// timer == (QObject *)obj

QAbstractButton *button = qobject_cast<QAbstractButton *>(obj);
// button == nullptr

qobject_cast() 함수는 표준 C++ dynamic_cast() 과 유사하게 동작하며, RTTI 지원이 필요하지 않고 동적 라이브러리 경계를 넘나들며 작동한다는 장점이 있습니다.

qobject_cast() 함수는 인터페이스와 함께 사용할 수도 있습니다.

경고: T가 Q_OBJECT 매크로와 함께 선언되지 않은 경우 이 함수의 반환 값은 정의되지 않습니다.

QObject::inherits()도 참조하세요 .

QObjectList

QList<QObject *>의 동의어입니다.

[since 6.8] enum class TimerId

타이머 ID를 나타내는 데 사용됩니다(예: QTimerQChronoTimer). 기본 유형은 int 입니다. qToUnderlying ()를 사용하여 Qt::TimerId 를 int 로 변환할 수 있습니다.

상수설명
QObject::TimerId::Invalid0비작동 타이머 ID를 나타냅니다; 그 사용법은 컨텍스트에 따라 다릅니다; 예를 들어, 타이머를 시작하지 못했음을 나타내는 QObject::startTimer()가 반환하는 값이고, 타이머가 비활성 상태일 때, 즉 timer.isActive()false 를 반환하는 것과 같이, QChronoTimer::id()는 이 값을 반환합니다.

이 열거형은 Qt 6.8에서 도입되었습니다.

QTimer::id(), QChronoTimer::id() 및 QObject::startTimer()도 참조하십시오 .

매크로 문서

[since 6.7] QT_NO_CONTEXTLESS_CONNECT

이 매크로를 정의하면 수신자/컨텍스트 객체로 QObject (즉, QObject::connect()의 3 인수 오버로드)를 지정하지 않고도 신호를 펙터에 연결하는 QObject::connect()의 오버로드를 비활성화할 수 있습니다.

컨텍스트 없는 오버로드를 사용하면 수신 측의 일부 로컬 상태에 의존하는 함수에 연결하기 쉽기 때문에 오류가 발생하기 쉽습니다. 이러한 로컬 상태가 파괴되면 연결이 자동으로 끊어지지 않습니다.

또한 이러한 연결은 항상 직접 연결이기 때문에 멀티스레드 시나리오에서 문제가 발생할 수 있습니다(예: 신호가 다른 스레드에서 방출되는 경우).

이 매크로는 Qt 6.7에 도입되었습니다.

QObject::connectQt::ConnectionType참조하십시오 .

QT_NO_NARROWING_CONVERSIONS_IN_CONNECT

이 매크로를 정의하면 신호와 슬롯이 PMF 기반 구문을 사용하여 연결될 때 신호가 전달하는 인수와 슬롯이 받아들이는 인수 간의 좁히기 및 부동 소수점-적분 변환을 비활성화합니다.

QObject::connect도 참조하세요 .

Q_CLASSINFO(Name, Value)

이 매크로는 QObject::metaObject()를 사용하여 사용할 수 있는 추가 정보를 클래스에 연결합니다. 추가 정보는 Name 문자열과 Value 리터럴 문자열의 형태를 취합니다.

예제:

class MyClass : public QObject
{
    Q_OBJECT
    Q_CLASSINFO("Author", "Pierre Gendron")
    Q_CLASSINFO("URL", "http://www.my-organization.qc.ca")

public:
    ...
};

Qt는 매크로를 Qt D-BusQt Qml 모듈을 사용합니다. 예를 들어, C++에서 QML 객체 유형을 정의할 때 프로퍼티를 기본값으로 지정할 수 있습니다:

Q_CLASSINFO("DefaultProperty", "content")

QMetaObject::classInfo(), Qt D-Bus 어댑터 사용C++에서 QML 유형 정의하기를참조하세요 .

Q_EMIT

이 매크로를 사용하면 타사 신호/슬롯 메커니즘으로 Qt 신호 및 슬롯을 사용하려는 경우 신호 방출을 위해 emit 키워드를 대체할 수 있습니다.

이 매크로는 일반적으로 .pro 파일에서 CONFIG 변수와 함께 no_keywords 을 지정할 때 사용되지만, no_keywords지정하지 않은 경우에도 사용할 수 있습니다.

Q_ENUM(...)

이 매크로는 메타 객체 시스템에 열거형 유형을 등록합니다. Q_OBJECT , Q_GADGET 또는 Q_GADGET_EXPORT 매크로가 있는 클래스에서 열거형 선언 뒤에 배치해야 합니다. 네임스페이스의 경우 Q_ENUM_NS()를 대신 사용합니다.

예를 들어

class MyClass : public QObject
{
    Q_OBJECT

public:
    MyClass(QObject *parent = nullptr);
    ~MyClass();

    enum Priority { High, Low, VeryHigh, VeryLow };
    Q_ENUM(Priority)
    void setPriority(Priority priority);
    Priority priority() const;
};

Q_ENUM으로 선언된 열거형은 묶는 QMetaObjectQMetaEnum 을 등록합니다. QMetaEnum::fromType ()를 사용하여 QMetaEnum 을 가져올 수도 있습니다.

등록된 열거형은 Qt 메타 타입 시스템에도 자동으로 등록되므로 Q_DECLARE_METATYPE()을 사용할 필요 없이 QMetaType 에 알 수 있습니다. 이렇게 하면 유용한 기능을 사용할 수 있습니다. 예를 들어 QVariant 에서 사용하면 문자열로 변환할 수 있습니다. 마찬가지로 QDebug 에 전달하면 이름이 출력됩니다.

열거형 값은 메타 객체 시스템에서 서명된 int 으로 저장된다는 점에 유의하세요. int 에 유효한 값 범위를 벗어나는 값으로 열거형을 등록하면 메타 객체 시스템을 통해 열거형에 액세스할 때 오버플로 및 잠재적으로 정의되지 않은 동작이 발생할 수 있습니다. 예를 들어 QML은 메타 객체 시스템을 통해 등록된 열거형에 액세스합니다.

Qt의 프로퍼티 시스템도참조하십시오 .

Q_ENUM_NS(...)

이 매크로는 메타 객체 시스템에 열거 형을 등록합니다. Q_NAMESPACE 매크로가 있는 네임스페이스에서 열거형 선언 뒤에 배치해야 합니다. Q_ENUM 과 동일하지만 네임스페이스에 위치합니다.

Q_ENUM_NS로 선언된 열거형은 묶는 QMetaObjectQMetaEnum 을 등록합니다. QMetaEnum::fromType ()를 사용하여 QMetaEnum 을 가져올 수도 있습니다.

등록된 열거형은 Qt 메타 타입 시스템에도 자동으로 등록되어 Q_DECLARE_METATYPE()을 사용할 필요 없이 QMetaType 에 알려집니다. 이렇게 하면 유용한 기능을 사용할 수 있습니다. 예를 들어 QVariant 에서 사용하면 문자열로 변환할 수 있습니다. 마찬가지로 QDebug 에 전달하면 이름이 출력됩니다.

열거형 값은 메타 객체 시스템에서 서명된 int 으로 저장된다는 점에 유의하세요. int 에 유효한 값 범위를 벗어나는 값으로 열거형을 등록하면 메타 객체 시스템을 통해 열거형에 액세스할 때 오버플로 및 잠재적으로 정의되지 않은 동작이 발생할 수 있습니다. 예를 들어 QML은 메타 객체 시스템을 통해 등록된 열거형에 액세스합니다.

Qt의 프로퍼티 시스템도참조하십시오 .

Q_FLAG(...)

이 매크로는 메타 객체 시스템에 단일 flags type 을 등록합니다. 일반적으로 클래스 정의에서 주어진 열거형 값을 플래그로 사용할 수 있고 비트 단위 OR 연산자를 사용하여 결합할 수 있음을 선언하는 데 사용됩니다. 네임스페이스의 경우 Q_FLAG_NS()를 대신 사용합니다.

매크로는 열거형 선언 뒤에 배치해야 합니다. 플래그 유형 선언은 Q_DECLARE_FLAGS() 매크로를 사용하여 수행합니다.

예를 들어 QItemSelectionModel 에서 SelectionFlags 플래그는 다음과 같은 방식으로 선언됩니다:

class QItemSelectionModel : public QObject
{
    Q_OBJECT

public:
    ...
    enum SelectionFlag {
        NoUpdate       = 0x0000,
        Clear          = 0x0001,
        Select         = 0x0002,
        Deselect       = 0x0004,
        Toggle         = 0x0008,
        Current        = 0x0010,
        Rows           = 0x0020,
        Columns        = 0x0040,
        SelectCurrent  = Select | Current,
        ToggleCurrent  = Toggle | Current,
        ClearAndSelect = Clear | Select
    };

    Q_DECLARE_FLAGS(SelectionFlags, SelectionFlag)
    Q_FLAG(SelectionFlags)
    ...
}

참고: Q_FLAG 매크로는 메타 객체 시스템에 개별 플래그 값을 등록하는 작업을 처리하므로 이 매크로와 함께 Q_ENUM()를 사용할 필요가 없습니다.

Qt의 프로퍼티 시스템도참조하십시오 .

Q_FLAG_NS(...)

이 매크로는 메타 객체 시스템에 단일 flags type 을 등록합니다. Q_NAMESPACE 매크로가 있는 네임스페이스에서 사용되며, 주어진 열거형 값을 플래그로 사용하고 비트 OR 연산자를 사용하여 결합할 수 있음을 선언하는 데 사용됩니다. Q_FLAG 와 동일하지만 네임스페이스에서 사용됩니다.

매크로는 열거형 선언 뒤에 배치해야 합니다.

참고: Q_FLAG_NS 매크로는 메타 객체 시스템에 개별 플래그 값을 등록하는 작업을 처리하므로 이 매크로와 함께 Q_ENUM_NS()를 사용할 필요가 없습니다.

Qt의 프로퍼티 시스템도참조하십시오 .

Q_GADGET

Q_GADGET 매크로는 QObject 에서 상속하지 않지만 QMetaObject 에서 제공하는 일부 반영 기능을 사용하려는 클래스를 위한 Q_OBJECT 매크로의 가벼운 버전입니다.

참고: 이 매크로 확장은 private: 액세스 지정자로 끝납니다. 이 매크로 바로 뒤에 멤버를 선언하면 해당 멤버도 비공개가 됩니다. 매크로 바로 뒤에 공개(또는 보호) 멤버를 추가하려면 public: (또는 protected:) 액세스 지정자를 사용합니다.

Q_GADGET은 Q_ENUM, Q_PROPERTYQ_INVOKABLE 을 가질 수 있지만 신호나 슬롯은 가질 수 없습니다.

staticMetaObject staticMetaObject 은 유형이며 으로 선언된 열거형에 대한 액세스를 제공합니다. QMetaObject Q_ENUM

Q_GADGET_EXPORT도 참조하십시오 .

[since 6.3] Q_GADGET_EXPORT(EXPORT_MACRO)

Q_GADGET_EXPORT 매크로는 Q_GADGET 매크로와 똑같이 작동합니다. 그러나 사용 가능한 staticMetaObject 변수는 EXPORT_MACRO 한정자와 함께 선언됩니다( Q_GADGET 참조). 이는 객체를 동적 라이브러리에서 내보내야 하지만 객체를 둘러싸고 있는 클래스가 전체적으로 인라인 함수로 구성되어 있어서는 안 되는 경우(예: 대부분 인라인 함수로 구성되어 있기 때문)에 유용합니다.

참고: 이 매크로 확장은 private: 액세스 지정자로 끝납니다. 이 매크로 바로 뒤에 멤버를 선언하면 해당 멤버도 비공개가 됩니다. 매크로 바로 뒤에 공개(또는 보호된) 멤버를 추가하려면 public: (또는 protected:) 액세스 지정자를 사용합니다.

예를 들어

class Point {
    Q_GADGET_EXPORT(EXPORT_MACRO)
    Q_PROPERTY(int x MEMBER x)
    Q_PROPERTY(int y MEMBER y)
    ~~~

이 매크로는 Qt 6.3에 도입되었습니다.

Q_GADGET공유 라이브러리 만들기를참조하세요 .

Q_INTERFACES(...)

이 매크로는 클래스가 구현하는 인터페이스를 Qt에 알려줍니다. 플러그인을 구현할 때 사용됩니다.

Q_DECLARE_INTERFACE(), Q_PLUGIN_METADATA() 및 Qt 플러그인 생성 방법도참조하십시오 .

Q_INVOKABLE

이 매크로를 멤버 함수의 선언에 적용하여 메타 객체 시스템을 통해 호출할 수 있도록 합니다. 매크로는 다음 예시와 같이 반환 유형 앞에 작성됩니다:

class Window : public QWidget
{
    Q_OBJECT

public:
    Window();
    void normalMethod();
    Q_INVOKABLE void invokableMethod();
};

invokableMethod() 함수는 Q_INVOKABLE을 사용하여 마크업되어 메타 객체 시스템에 등록되고 QMetaObject::invokeMethod()을 사용하여 호출할 수 있습니다. normalMethod() 함수는 이러한 방식으로 등록되지 않았으므로 QMetaObject::invokeMethod()를 사용하여 호출할 수 없습니다.

호출 가능한 멤버 함수가 QObject 또는 QObject 의 서브클래스에 대한 포인터를 반환하고 QML에서 호출되는 경우 특별한 소유권 규칙이 적용됩니다. 자세한 내용은 QML과 C++ 간의 데이터 유형 변환을 참조하세요.

[since 6.0] Q_MOC_INCLUDE

Q_MOC_INCLUDE 매크로는 클래스 내부 또는 외부에서 사용할 수 있으며, Meta-Object Compiler에 포함을 추가하도록 지시할 수 있습니다.

// Put this in your code and the generated code will include this header.
Q_MOC_INCLUDE("myheader.h")

프로퍼티나 시그널/슬롯 인자로 사용하는 타입이 포워드 선언된 경우에 유용합니다.

이 매크로는 Qt 6.0에 도입되었습니다.

Q_NAMESPACE

Q_NAMESPACE 매크로는 네임스페이스에 QMetaObject 기능을 추가하는 데 사용할 수 있습니다.

Q_NAMESPACE는 Q_CLASSINFO, Q_ENUM_NS, Q_FLAG_NS 를 가질 수 있지만 Q_ENUM, Q_FLAG, Q_PROPERTY, Q_INVOKABLE, 신호나 슬롯은 가질 수 없습니다.

staticMetaObject staticMetaObject 은 유형이며 / 으로 선언된 열거형에 대한 액세스를 제공합니다. QMetaObject Q_ENUM_NSQ_FLAG_NS

예를 들어:

namespace test {
Q_NAMESPACE
...

Q_NAMESPACE_EXPORT참조하세요 .

Q_NAMESPACE_EXPORT(EXPORT_MACRO)

Q_NAMESPACE_EXPORT 매크로를 사용하여 네임스페이스에 QMetaObject 기능을 추가할 수 있습니다.

Q_NAMESPACE 매크로와 똑같이 작동합니다. 그러나 네임스페이스에 정의되는 외부 staticMetaObject 변수는 제공된 EXPORT_MACRO 한정자와 함께 선언됩니다. 이 기능은 동적 라이브러리에서 객체를 내보내야 하는 경우에 유용합니다.

예를 들어

namespace test {
Q_NAMESPACE_EXPORT(EXPORT_MACRO)
...

Q_NAMESPACE공유 라이브러리 만들기를참조하세요 .

Q_OBJECT

Q_OBJECT 매크로는 동적 프로퍼티, 신호, 슬롯과 같은 메타 객체 기능을 활성화하는 데 사용됩니다.

자체 신호와 슬롯을 선언하거나 Qt의 메타 객체 시스템에서 제공하는 다른 서비스를 사용하는 클래스 정의의 모든 섹션에 Q_OBJECT 매크로를 추가할 수 있습니다.

참고: 이 매크로 확장은 private: 액세스 지정자로 끝납니다. 이 매크로 바로 뒤에 멤버를 선언하면 해당 멤버도 비공개가 됩니다. 매크로 바로 뒤에 공개(또는 보호) 멤버를 추가하려면 public: (또는 protected:) 액세스 지정자를 사용합니다.

예시:

#include <QObject>

class Counter : public QObject
{
    Q_OBJECT

// Note. The Q_OBJECT macro starts a private section.
// To declare public members, use the 'public:' access modifier.
public:
    Counter() { m_value = 0; }

    int value() const { return m_value; }

public slots:
    void setValue(int value);

signals:
    void valueChanged(int newValue);

private:
    int m_value;
};

참고: 이 매크로를 사용하려면 클래스가 QObject 의 서브클래스여야 합니다. QObject 서브클래스가 아닌 클래스에서 열거형에 대한 메타 객체 시스템의 지원을 사용하려면 Q_OBJECT 대신 Q_GADGET 또는 Q_GADGET_EXPORT 을 사용하세요.

메타 객체 시스템, 시그널과 슬롯, Qt의 프로퍼티 시스템도참조하십시오 .

Q_PROPERTY(...)

이 매크로는 QObject 을 상속하는 클래스에서 프로퍼티를 선언하는 데 사용됩니다. 프로퍼티는 클래스 데이터 멤버처럼 작동하지만 메타객체 시스템을 통해 액세스할 수 있는 추가 기능이 있습니다.

Q_PROPERTY(type name
           (READ getFunction [WRITE setFunction] |
            MEMBER memberName [(READ getFunction | WRITE setFunction)])
           [RESET resetFunction]
           [NOTIFY notifySignal]
           [REVISION int | REVISION(int[, int])]
           [DESIGNABLE bool]
           [SCRIPTABLE bool]
           [STORED bool]
           [USER bool]
           [BINDABLE bindableProperty]
           [CONSTANT]
           [FINAL]
           [REQUIRED])

프로퍼티 이름과 유형 및 READ 함수가 필요합니다. 유형은 QVariant 에서 지원하는 모든 유형이거나 사용자 정의 유형일 수 있습니다. 다른 항목은 선택 사항이지만 WRITE 함수가 일반적입니다. 기본값이 false인 USER 을 제외한 모든 속성의 기본값은 true입니다.

예를 들어

Q_PROPERTY(QString title READ title WRITE setTitle USER true)

이 매크로를 사용하는 방법에 대한 자세한 내용과 자세한 사용 예는 Qt의 속성 시스템에 대한 토론을 참조하십시오.

Qt의 프로퍼티 시스템도참조하십시오 .

Q_REVISION

이 매크로를 멤버 함수의 선언에 적용하여 메타 객체 시스템에서 리비전 번호로 태그를 지정합니다. 매크로는 다음 예시와 같이 반환 유형 앞에 작성됩니다:

class Window : public QWidget
{
    Q_OBJECT
    Q_PROPERTY(int normalProperty READ normalProperty)
    Q_PROPERTY(int newProperty READ newProperty REVISION(2, 1))

public:
    Window();
    int normalProperty();
    int newProperty();
public slots:
    void normalMethod();
    Q_REVISION(2, 1) void newMethod();
};

이는 메타객체 시스템을 사용하여 다른 API에 객체를 동적으로 노출할 때 유용하며, 다른 API의 여러 버전에서 예상되는 버전과 일치시킬 수 있기 때문입니다. 다음의 간단한 예시를 살펴보세요:

    Window window;
    int expectedRevision = 0;
    const QMetaObject *windowMetaObject = window.metaObject();
    for (int i=0; i < windowMetaObject->methodCount(); i++)
        if (windowMetaObject->method(i).revision() <= expectedRevision)
            exposeMethod(windowMetaObject->method(i));
    for (int i=0; i < windowMetaObject->propertyCount(); i++)
        if (windowMetaObject->property(i).revision() <= expectedRevision)
            exposeProperty(windowMetaObject->property(i));

이전 예제와 동일한 Window 클래스를 사용하는 경우, 이 코드에서는 예상 버전이 2.1 이상인 경우에만 newProperty 및 newMethod가 노출됩니다.

태그가 없는 경우 모든 메서드는 0 버전에 있는 것으로 간주되므로 Q_REVISION(0) 또는 Q_REVISION(0, 0) 태그는 유효하지 않고 무시됩니다.

Q_REVISION 에 하나 또는 두 개의 정수 매개 변수를 전달할 수 있습니다. 매개 변수를 하나만 전달하면 부 버전만 나타냅니다. 즉, 메이저 버전이 지정되지 않았음을 의미합니다. 두 개를 전달하면 첫 번째 매개변수는 메이저 버전이고 두 번째 매개변수는 마이너 버전이 됩니다.

이 태그는 메타 객체 시스템 자체에서는 사용되지 않습니다. 현재 이 태그는 QtQml 모듈에서만 사용됩니다.

보다 일반적인 문자열 태그는 QMetaMethod::tag()를 참조하세요.

QMetaMethod::revision()도 참조하세요 .

Q_SET_OBJECT_NAME(Object)

이 매크로는 Object "객체"를 objectName "객체"로 할당합니다.

Object 이 포인터인지 여부는 중요하지 않으며 매크로가 알아서 알아냅니다.

QObject::objectName()도 참조하세요 .

Q_SIGNAL

이것은 단일 함수를 신호로 표시할 수 있는 추가 매크로입니다. 특히 signals 또는 Q_SIGNALS 그룹을 이해하지 못하는 타사 소스 코드 파서를 사용할 때 매우 유용할 수 있습니다.

이 매크로를 사용하여 타사 신호/슬롯 메커니즘으로 Qt 신호 및 슬롯을 사용하려는 경우 클래스 선언에서 signals 키워드를 대체할 수 있습니다.

이 매크로는 일반적으로 .pro 파일에서 CONFIG 변수와 함께 no_keywords 을 지정할 때 사용되지만, no_keywords지정하지 않은 경우에도 사용할 수 있습니다.

Q_SIGNALS

이 매크로를 사용하면 타사 신호/슬롯 메커니즘으로 Qt 신호와 슬롯을 사용하고자 할 때 클래스 선언에서 signals 키워드를 대체할 수 있습니다.

이 매크로는 일반적으로 .pro 파일에서 CONFIG 변수와 함께 no_keywords 을 지정할 때 사용되지만, no_keywords지정하지 않은 경우에도 사용할 수 있습니다.

Q_SLOT

이것은 단일 함수를 슬롯으로 표시할 수 있는 추가 매크로입니다. 특히 slots 또는 Q_SLOTS 그룹을 이해하지 못하는 타사 소스 코드 파서를 사용할 때 매우 유용할 수 있습니다.

이 매크로를 사용하면 타사 신호/슬롯 메커니즘으로 Qt 신호와 슬롯을 사용하고자 할 때 클래스 선언에서 slots 키워드를 대체할 수 있습니다.

이 매크로는 일반적으로 .pro 파일에서 CONFIG 변수와 함께 no_keywords 을 지정할 때 사용되지만, no_keywords지정하지 않은 경우에도 사용할 수 있습니다.

Q_SLOTS

이 매크로를 사용하면 타사 신호/슬롯 메커니즘으로 Qt 신호 및 슬롯을 사용하고자 할 때 클래스 선언에서 slots 키워드를 대체할 수 있습니다.

이 매크로는 일반적으로 .pro 파일에서 CONFIG 변수와 함께 no_keywords 을 지정할 때 사용되지만, no_keywords지정하지 않은 경우에도 사용할 수 있습니다.

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.