작업 메뉴 확장
Qt Widgets Designer 에 대한 사용자 지정 위젯 플러그인을 만들고 플러그인과 연결된 사용자 지정 작업 메뉴 항목을 제공합니다.
작업 메뉴 확장 예제에서는 다음에 대한 사용자 지정 위젯 플러그인을 만드는 방법과 Qt Widgets Designer에 대한 사용자 지정 위젯 플러그인을 만드는 방법과 QDesignerTaskMenuExtension 클래스를 사용하여 플러그인과 연결된 사용자 지정 작업 메뉴 항목을 제공하는 방법을 보여 줍니다.
Qt Widgets Designer 와 함께 사용할 수 있는 사용자 정의 위젯을 제공하려면 독립된 구현을 제공해야 합니다. 이 예에서는 작업 메뉴 확장 기능을 표시하도록 설계된 사용자 정의 위젯을 사용합니다: 틱택토 위젯입니다.
확장은 Qt Widgets Designer 의 동작을 수정하는 객체입니다. 이 확장이 있는 위젯을 선택하면 QDesignerTaskMenuExtension 에서 사용자 지정 작업 메뉴 항목을 제공할 수 있습니다.
Qt Widgets Designer 에는 네 가지 유형의 확장을 사용할 수 있습니다:
- QDesignerContainerExtension Qt Widgets Designer 에서 다중 페이지 컨테이너 플러그인에 페이지를 추가(및 삭제)할 수 있는 확장 기능을 제공합니다.
- QDesignerMemberSheetExtension Qt Widgets Designer 의 신호 및 슬롯 편집 모드를 사용하여 연결을 구성할 때 표시되는 위젯의 멤버 함수를 조작할 수 있는 확장 기능을 제공합니다.
- QDesignerPropertySheetExtension Qt Widgets Designer 의 속성 편집기에 표시되는 위젯의 속성을 조작할 수 있는 확장 기능을 제공합니다.
- QDesignerTaskMenuExtension Qt Widgets Designer 의 작업 메뉴에 사용자 지정 메뉴 항목을 추가할 수 있는 확장 기능을 제공합니다.
이 예시와 동일한 패턴에 따라 모든 확장 기능을 사용할 수 있으며, 각 확장 기능의 기본 클래스만 교체하면 됩니다. 자세한 내용은 Qt Widgets Designer C++ Classes.
작업 메뉴 확장 예제는 5개의 클래스로 구성되어 있습니다:
TicTacToe
는 사용자가 틱택토 게임을 할 수 있는 사용자 정의 위젯입니다.TicTacToePlugin
TicTacToe
클래스를 Qt Widgets Designer 에 노출합니다.TicTacToeTaskMenuFactory
TicTacToeTaskMenu
객체를 생성합니다.TicTacToeTaskMenu
작업 메뉴 확장, 즉 플러그인의 관련 작업 메뉴 항목을 제공합니다.TicTacToeDialog
사용자가 Qt Widgets Designer 에 로드된 틱택토 플러그인의 상태를 수정할 수 있도록 합니다.
사용자 정의 위젯 플러그인의 프로젝트 파일은 Qt Widgets Designer 에서 작동할 수 있도록 몇 가지 추가 정보가 필요합니다. 예를 들어 사용자 정의 위젯 플러그인은 Qt Widgets Designer 과 함께 제공되는 컴포넌트에 의존하므로 사용하는 프로젝트 파일에 이 컴포넌트를 지정해야 합니다. 먼저 플러그인의 프로젝트 파일을 살펴보겠습니다.
그런 다음 TicTacToePlugin
클래스를 계속 검토하고 TicTacToeTaskMenuFactory
및 TicTacToeTaskMenu
클래스를 살펴봅니다. 마지막으로 TicTacToeDialog
클래스를 검토한 후 TicTacToe
위젯의 클래스 정의를 간단히 살펴보겠습니다.
프로젝트 파일
CMake
프로젝트 파일에는 Qt Widgets Designer 라이브러리에 연결되는 플러그인을 빌드할 것임을 명시해야 합니다:
find_package(Qt6 REQUIRED COMPONENTS Core Designer Gui Widgets) qt_add_plugin(taskmenuextension) target_link_libraries(taskmenuextension PUBLIC Qt::Core Qt::Designer Qt::Gui Qt::Widgets )
다음 예시는 위젯의 헤더와 소스 파일을 추가하는 방법을 보여줍니다:
target_sources(taskmenuextension PRIVATE tictactoe.cpp tictactoe.h tictactoedialog.cpp tictactoedialog.h tictactoeplugin.cpp tictactoeplugin.h tictactoetaskmenu.cpp tictactoetaskmenu.h )
Qt Widgets Designer 에서 사용자 정의 위젯을 사용할 수 있도록 플러그인 인터페이스의 구현을 제공합니다. 이 특정 예에서는 작업 메뉴 확장 및 확장 팩토리 구현과 대화 상자 구현도 제공합니다.
Qt Widgets Designer 에서 검색되는 위치에 플러그인이 설치되어 있는지 확인하는 것이 중요합니다. 프로젝트의 대상 경로를 지정하고 설치할 항목 목록에 추가하여 이를 수행합니다:
set(INSTALL_EXAMPLEDIR "${QT6_INSTALL_PREFIX}/${QT6_INSTALL_PLUGINS}/designer") install(TARGETS taskmenuextension RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" )
작업 메뉴 확장은 라이브러리로 만들어집니다. 프로젝트가 설치될 때 다른 Qt Widgets Designer 플러그인과 함께 설치됩니다( ninja install
또는 이와 유사한 설치 절차 사용).
플러그인에 대한 자세한 내용은 Qt 플러그인 생성 방법 문서를 참조하십시오.
qmake
다음 예제는 Qt Widgets Designer 라이브러리에 플러그인을 링크하는 방법을 보여줍니다:
TEMPLATE = lib CONFIG += plugin QT += widgets designer
다음 예는 위젯의 헤더 및 소스 파일을 추가하는 방법을 보여줍니다:
HEADERS += tictactoe.h \ tictactoedialog.h \ tictactoeplugin.h \ tictactoetaskmenu.h SOURCES += tictactoe.cpp \ tictactoedialog.cpp \ tictactoeplugin.cpp \ tictactoetaskmenu.cpp OTHER_FILES += tictactoe.json
다음 예제는 Qt Widgets Designer 의 플러그인 경로에 플러그인을 설치하는 방법을 보여줍니다:
target.path = $$[QT_INSTALL_PLUGINS]/designer INSTALLS += target
틱택토플러그인 클래스 정의
TicTacToePlugin
클래스는 the
틱택토 클래스를 Qt Widgets Designer 에 노출합니다. 이 클래스의 정의는 사용자 정의 위젯 플러그인 예제의 플러그인 클래스에 자세히 설명된 것과 동일합니다. 클래스 정의에서 이 특정 사용자 정의 위젯에 특정한 부분은 클래스 이름뿐입니다.
Qt가 위젯을 플러그인으로 인식하도록 하려면 Q_PLUGIN_METADATA()
매크로를 추가하여 위젯에 대한 관련 정보를 내보내십시오:
#ifndef TICTACTOEPLUGIN_H #define TICTACTOEPLUGIN_H #include <QtUiPlugin/QDesignerCustomWidgetInterface> class QIcon; class QWidget; class TicTacToePlugin : public QObject, public QDesignerCustomWidgetInterface { Q_OBJECT Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QDesignerCustomWidgetInterface") Q_INTERFACES(QDesignerCustomWidgetInterface) public: explicit TicTacToePlugin(QObject *parent = nullptr); QString name() const override; QString group() const override; QString toolTip() const override; QString whatsThis() const override; QString includeFile() const override; QIcon icon() const override; bool isContainer() const override; QWidget *createWidget(QWidget *parent) override; bool isInitialized() const override; void initialize(QDesignerFormEditorInterface *formEditor) override; QString domXml() const override; private: bool initialized = false; }; #endif
플러그인 클래스는 Qt Widgets Designer 에 클래스 이름과 포함 파일과 같은 플러그인에 대한 기본 정보를 제공합니다. 또한 TicTacToe
위젯의 인스턴스를 생성하는 방법도 알고 있습니다. 또한 틱택토플러그인은 플러그인이 Qt Widgets Designer 에 로드된 후 호출되는 initialize() 함수를 정의합니다. 이 함수의 QDesignerFormEditorInterface 매개변수는 플러그인에 Qt Widgets Designer 의 모든 API에 대한 게이트웨이를 제공합니다.
TicTacToePlugin
클래스는 QObject 과 QDesignerCustomWidgetInterface 모두에서 상속합니다. 다중 상속을 사용할 때는 Q_INTERFACES() 매크로를 사용하여 모든 인터페이스(즉, Q_OBJECT 를 상속하지 않는 클래스)가 메타 객체 시스템에 알려지도록 하는 것이 중요합니다. 이렇게 하면 Qt Widgets Designer 에서 qobject_cast()를 사용하여 QObject 포인터만 사용하여 지원되는 인터페이스를 쿼리할 수 있습니다.
틱택토 플러그인 클래스 구현
틱택토플러그인 클래스 구현은 대부분의 부분에서 사용자 정의 위젯 플러그인 예제의 플러그인 클래스와 동일합니다:
TicTacToePlugin::TicTacToePlugin(QObject *parent) : QObject(parent) { } QString TicTacToePlugin::name() const { return u"TicTacToe"_s; } QString TicTacToePlugin::group() const { return u"Display Widgets [Examples]"_s; } QString TicTacToePlugin::toolTip() const { return u"Tic Tac Toe Example, demonstrating class QDesignerTaskMenuExtension (C++)"_s; } QString TicTacToePlugin::whatsThis() const { return {}; } QString TicTacToePlugin::includeFile() const { return u"tictactoe.h"_s; } QIcon TicTacToePlugin::icon() const { return {}; } bool TicTacToePlugin::isContainer() const { return false; } QWidget *TicTacToePlugin::createWidget(QWidget *parent) { auto *ticTacToe = new TicTacToe(parent); ticTacToe->setState(u"-X-XO----"_s); return ticTacToe; } bool TicTacToePlugin::isInitialized() const { return initialized; }
크게 다른 유일한 함수는 초기화() 함수입니다:
void TicTacToePlugin::initialize(QDesignerFormEditorInterface *formEditor) {
initialize()
함수는 QDesignerFormEditorInterface 객체를 인수로 받습니다. QDesignerFormEditorInterface 클래스는 Qt Widgets Designer 의 컴포넌트에 대한 액세스를 제공합니다.
Qt Widgets Designer 에서는 사용자 정의 위젯 플러그인과 도구 플러그인의 두 가지 종류의 플러그인을 만들 수 있습니다. QDesignerFormEditorInterface 에서는 일반적으로 도구 플러그인을 만드는 데 필요한 모든 Qt Widgets Designer 구성 요소(확장 관리자, 개체 검사기, 속성 편집기 및 위젯 상자)에 대한 액세스를 제공합니다. 사용자 지정 위젯 플러그인은 동일한 구성 요소에 액세스할 수 있습니다.
if (initialized) return; auto *manager = formEditor->extensionManager(); Q_ASSERT(manager != nullptr);
사용자 지정 위젯 플러그인과 연결된 확장 프로그램을 만들 때는 QDesignerFormEditorInterface 매개변수에서 검색하는 Qt Widgets Designer 의 현재 확장 프로그램 관리자에 액세스해야 합니다.
Qt Widgets Designer의 QDesignerFormEditorInterface 에는 Qt Designer 의 모든 컴포넌트에 대한 정보가 들어 있습니다: 액션 편집기, 개체 검사기, 속성 편집기, 위젯 상자, 확장 및 양식 창 관리자 등이 있습니다.
QExtensionManager 클래스는 Qt Widgets Designer 에 대한 확장 관리 기능을 제공합니다. Qt Widgets Designer 의 현재 확장 관리자를 사용하면 지정된 개체의 확장자를 검색할 수 있습니다. 또한 지정된 객체에 대한 확장자를 등록하거나 등록을 취소할 수도 있습니다. 확장자는 Qt Widgets Designer 의 동작을 수정하는 객체라는 것을 기억하세요.
확장 프로그램을 등록할 때 실제로 등록되는 것은 연결된 확장 팩토리입니다. Qt Widgets Designer 에서 확장 팩토리는 필요에 따라 명명된 확장 프로그램을 조회하고 만드는 데 사용됩니다. 따라서 이 예에서는 사용자가 작업 메뉴를 요청할 때까지 작업 메뉴 확장 자체는 만들어지지 않습니다.
manager->registerExtensions(new TicTacToeTaskMenuFactory(manager), Q_TYPEID(QDesignerTaskMenuExtension)); initialized = true; } QString TicTacToePlugin::domXml() const { return uR"( <ui language="c++"> <widget class="TicTacToe" name="ticTacToe"/> <customwidgets> <customwidget> <class>TicTacToe</class> <propertyspecifications> <tooltip name="state">Tic Tac Toe state</tooltip> <stringpropertyspecification name="state" notr="true" type="singleline"/> </propertyspecifications> </customwidget> </customwidgets> </ui> )"_s; }
Qt Widgets Designer 의 현재 extension manager 를 QDesignerFormEditorInterface 매개변수에서 검색하여 등록하는 TicTacToeTaskMenuFactory
객체를 만듭니다. 첫 번째 인수는 새로 생성된 팩토리이고 두 번째 인수는 문자열인 확장 식별자입니다. Q_TYPEID()
매크로는 단순히 문자열을 QLatin1String 으로 변환합니다.
TicTacToeTaskMenuFactory
클래스는 QExtensionFactory 의 하위 클래스입니다. 사용자가 지정된 작업 메뉴 확장자가 있는 위젯 위에 마우스 오른쪽 버튼을 클릭하여 작업 메뉴를 요청하면 Qt Widgets Designer 의 확장 관리자가 등록된 모든 팩토리를 실행하여 선택한 위젯에 대한 작업 메뉴 확장자를 만들 수 있는 첫 번째 팩토리를 호출합니다. 이 팩토리는 차례로 TicTacToeTaskMenu
객체(확장자)를 생성합니다.
기본값이 필요하지 않으므로 QDesignerCustomWidgetInterface::domXml() 함수( Qt Widgets Designer 에서 사용하는 표준 XML 형식으로 위젯의 기본 설정을 포함)를 다시 구현하는 것은 생략합니다.
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QDesignerCustomWidgetInterface")
마지막으로 Q_PLUGIN_METADATA() 매크로를 사용하여 Qt의 플러그인 처리 클래스와 함께 사용할 수 있도록 TicTacToePlugin 클래스를 내보냅니다: 이 매크로는 Qt Widgets Designer 에서 사용자 정의 위젯에 액세스하고 구성할 수 있도록 합니다. 이 매크로가 없으면 Qt Widgets Designer 에서 위젯을 사용할 방법이 없습니다.
틱택토태스크메뉴팩토리 클래스 정의
TicTacToeTaskMenuFactory
클래스는 Qt Widgets Designer 에 대한 표준 확장 팩토리를 제공하는 QExtensionFactory 을 상속합니다.
class TicTacToeTaskMenuFactory : public QExtensionFactory { Q_OBJECT public: explicit TicTacToeTaskMenuFactory(QExtensionManager *parent = nullptr); protected: QObject *createExtension(QObject *object, const QString &iid, QObject *parent) const override; };
서브클래스의 목적은 QExtensionFactory::createExtension() 함수를 재구현하여 TicTacToe
작업 메뉴 확장을 생성할 수 있도록 하는 것입니다.
틱택토태스크메뉴팩토리 클래스 구현
클래스 생성자는 QExtensionFactory 베이스 클래스 생성자를 호출하기만 하면 됩니다:
TicTacToeTaskMenuFactory::TicTacToeTaskMenuFactory(QExtensionManager *parent) : QExtensionFactory(parent) { }
위에서 설명한 것처럼 사용자가 Qt Widgets Designer 에서 지정된 작업 메뉴 확장자가 있는 위젯 위에 마우스 오른쪽 버튼을 클릭하여 작업 메뉴를 요청하면 팩토리가 호출됩니다.
Qt Widgets Designer의 동작은 요청된 확장이 컨테이너, 멤버 시트, 속성 시트 또는 작업 메뉴와 연관되어 있는지 여부와 관계없이 동일합니다: 확장 관리자는 요청된 확장을 생성하여 응답할 때까지 등록된 모든 확장 팩토리를 통해 각각에 대해 createExtension()
을 호출합니다.
QObject *TicTacToeTaskMenuFactory::createExtension(QObject *object, const QString &iid, QObject *parent) const { if (iid != Q_TYPEID(QDesignerTaskMenuExtension)) return nullptr; if (auto *tic = qobject_cast<TicTacToe*>(object)) return new TicTacToeTaskMenu(tic, parent); return nullptr; }
따라서 TicTacToeTaskMenuFactory::createExtension()
에서 가장 먼저 하는 일은 요청된 확장이 작업 메뉴 확장자인지 확인하는 것입니다. 확장이 맞고 이를 요청하는 위젯이 TicTacToe
위젯인 경우 TicTacToeTaskMenu
객체를 생성하여 반환합니다. 그렇지 않으면 null 포인터를 반환하여 Qt Widgets Designer 의 확장 프로그램 관리자가 등록된 팩토리를 통해 검색을 계속할 수 있도록 합니다.
틱택토태스크메뉴 클래스 정의
TicTacToeTaskMenu
클래스는 QDesignerTaskMenuExtension 을 상속하여 Qt Widgets Designer 의 작업 메뉴에 사용자 정의 항목(QAction 형식)을 추가할 수 있습니다.
class TicTacToeTaskMenu : public QObject, public QDesignerTaskMenuExtension { Q_OBJECT Q_INTERFACES(QDesignerTaskMenuExtension) public: explicit TicTacToeTaskMenu(TicTacToe *tic, QObject *parent); QAction *preferredEditAction() const override; QList<QAction *> taskActions() const override; private slots: void editState(); private: QAction *editStateAction; TicTacToe *ticTacToe; };
preferredEditAction()
및 taskActions()
함수를 재구현합니다. 부모 위젯과 작업 메뉴가 요청되는 TicTacToe
위젯의 두 가지 인수를 받는 생성자를 구현한다는 점에 유의하세요.
또한 비공개 editState()
슬롯, 사용자 정의 editStateAction
및 수정하려는 상태인 TicTacToe
위젯에 대한 비공개 포인터를 선언합니다.
틱택토태스크메뉴 클래스 구현
TicTacToeTaskMenu::TicTacToeTaskMenu(TicTacToe *tic, QObject *parent) : QObject(parent) , editStateAction(new QAction(tr("Edit State..."), this)) , ticTacToe(tic) { connect(editStateAction, &QAction::triggered, this, &TicTacToeTaskMenu::editState); }
생성자에서는 먼저 파라미터로 전송된 TicTacToe
위젯에 대한 참조, 즉 수정하려는 상태 위젯을 저장합니다. 나중에 커스텀 액션이 호출될 때 이 정보가 필요합니다. 또한 사용자 지정 editStateAction
을 생성하고 editState()
슬롯에 연결합니다.
void TicTacToeTaskMenu::editState() { TicTacToeDialog dialog(ticTacToe); dialog.exec(); }
editState()
슬롯은 사용자가 TicTacToe
위젯의 작업 메뉴에서 상태 편집... 옵션을 선택할 때마다 호출됩니다. 이 슬롯은 위젯의 현재 상태를 표시하는 TicTacToeDialog
을 생성하고 사용자가 게임을 플레이하여 상태를 편집할 수 있도록 합니다.
QAction *TicTacToeTaskMenu::preferredEditAction() const { return editStateAction; }
preferredEditAction()
함수를 다시 구현하여 TicTacToe
위젯을 선택하고 F2 를 누를 때 호출되어야 하는 동작으로 사용자 지정 editStateAction
을 반환합니다.
QList<QAction *> TicTacToeTaskMenu::taskActions() const { return QList<QAction *>{editStateAction}; }
taskActions()
함수를 다시 구현하여 사용자 지정 동작 목록을 반환하여 TicTacToe
위젯의 작업 메뉴의 기본 메뉴 항목 위에 표시되도록 합니다.
틱택토 다이얼로그 클래스 정의
TicTacToeDialog
클래스는 QDialog 을 상속합니다. 이 대화상자를 통해 사용자는 현재 선택된 틱택토 플러그인의 상태를 수정할 수 있습니다.
class TicTacToeDialog : public QDialog { Q_OBJECT public: explicit TicTacToeDialog(TicTacToe *plugin = nullptr, QWidget *parent = nullptr); QSize sizeHint() const override; private slots: void resetState(); void saveState(); private: TicTacToe *editor; TicTacToe *ticTacToe; QDialogButtonBox *buttonBox; };
sizeHint()
함수를 다시 구현합니다. 또한 resetState()
와 saveState()
두 개의 비공개 슬롯을 선언합니다. 대화 상자의 버튼과 레이아웃 외에도 사용자가 상호작용할 수 있는 위젯과 사용자가 편집하려는 상태의 원래 사용자 정의 위젯 플러그인에 대한 두 개의 TicTacToe
포인터를 선언합니다.
틱택토 다이얼로그 클래스 구현
TicTacToeDialog::TicTacToeDialog(TicTacToe *tic, QWidget *parent) : QDialog(parent) , editor(new TicTacToe) , ticTacToe(tic) , buttonBox(new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel | QDialogButtonBox::Reset)) { editor->setState(ticTacToe->state()); connect(buttonBox->button(QDialogButtonBox::Reset), &QAbstractButton::clicked, this, &TicTacToeDialog::resetState); connect(buttonBox, &QDialogButtonBox::accepted, this, &TicTacToeDialog::saveState); connect(buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject); auto *mainLayout = new QVBoxLayout(this); mainLayout->addWidget(editor); mainLayout->addWidget(buttonBox); setWindowTitle(tr("Edit State")); }
생성자에서는 먼저 파라미터로 전송된 TicTacToe 위젯에 대한 참조, 즉 사용자가 수정하려는 상태의 위젯을 저장합니다. 그런 다음 TicTacToe
위젯을 새로 만들고 그 상태를 매개변수 위젯의 상태와 동일하도록 설정합니다.
마지막으로 대화 상자의 버튼과 레이아웃을 만듭니다.
QSize TicTacToeDialog::sizeHint() const { return {250, 250}; }
sizeHint()
함수를 다시 구현하여 대화 상자의 크기가 적당한지 확인합니다.
void TicTacToeDialog::resetState() { editor->clearBoard(); }
resetState()
슬롯은 사용자가 재설정 버튼을 누를 때마다 호출됩니다. 편집기 위젯, 즉 대화 상자의 생성자에서 만든 TicTacToe
위젯에 대해 clearBoard()
함수를 호출하는 것만 수행합니다.
void TicTacToeDialog::saveState() {
saveState()
슬롯은 사용자가 확인 버튼을 누를 때마다 호출되며, 편집기 위젯의 상태를 수정하려는 위젯으로 전송합니다. 상태 변경 사항을 Qt Widgets Designer 에 표시하려면 QDesignerFormWindowInterface 클래스를 사용하여 후자의 위젯의 상태 속성을 설정해야 합니다.
QDesignerFormWindowInterface 는 연결된 양식 창에 대한 정보를 제공할 뿐만 아니라 속성을 변경할 수 있게 해줍니다. 이 인터페이스는 직접 인스턴스화되는 것이 아니라 Qt Widgets Designer 의 양식 창 관리자에 의해 제어되는 Qt Widgets Designer 의 현재 양식 창에 대한 액세스를 제공하기 위한 것입니다.
특정 위젯이 포함된 양식 창을 찾고 있다면 정적 QDesignerFormWindowInterface::findFormWindow() 함수를 사용할 수 있습니다:
if (auto *formWindow = QDesignerFormWindowInterface::findFormWindow(ticTacToe)) formWindow->cursor()->setProperty("state", editor->state());
위젯의 양식 창(수정하려는 상태)을 검색한 후 QDesignerFormWindowInterface::cursor() 함수를 사용하여 양식 창의 커서를 검색합니다.
QDesignerFormWindowCursorInterface 클래스는 양식 창의 텍스트 커서에 대한 인터페이스를 제공합니다. 커서가 있으면 마지막으로 QDesignerFormWindowCursorInterface::setProperty() 함수를 사용하여 상태 속성을 설정할 수 있습니다.
accept(); }
마지막으로 이벤트 객체의 허용 플래그를 설정하는 QEvent::accept() 함수를 호출합니다. accept
매개변수를 설정하면 이벤트 수신자가 이벤트를 원한다는 것을 나타냅니다. 원치 않는 이벤트는 부모 위젯으로 전파될 수 있습니다.
틱택토 클래스 정의
TicTacToe
클래스는 사용자가 틱택토 게임을 플레이할 수 있는 사용자 정의 위젯입니다.
class TicTacToe : public QWidget { Q_OBJECT Q_PROPERTY(QString state READ state WRITE setState) public: explicit TicTacToe(QWidget *parent = nullptr); QSize minimumSizeHint() const override; QSize sizeHint() const override; void setState(const QString &newState); QString state() const; void clearBoard(); protected: void mousePressEvent(QMouseEvent *event) override; void paintEvent(QPaintEvent *event) override; private: static constexpr char16_t Empty = '-'; static constexpr char16_t Cross = 'X'; static constexpr char16_t Nought = 'O'; QRect cellRect(int position) const; int cellWidth() const { return width() / 3; } int cellHeight() const { return height() / 3; } QString myState; int turnNumber = 0; };
TicTacToe
클래스 정의에서 관찰해야 할 주요 세부 사항은 state
프로퍼티와 state()
및 setState()
함수의 선언입니다.
TicTacToe
위젯의 상태를 프로퍼티로 선언하여 Qt Widgets Designer 에 표시되도록 하고, Qt Widgets Designer 에서 TicTacToe
위젯이 QWidget 및 QObject 에서 상속받은 프로퍼티를 관리하는 것과 동일한 방식으로 관리할 수 있도록 해야 합니다.
© 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.