{"id":549,"date":"2020-05-15T19:11:20","date_gmt":"2020-05-15T10:11:20","guid":{"rendered":"http:\/\/batmask.dothome.co.kr\/?p=549"},"modified":"2020-05-15T19:11:20","modified_gmt":"2020-05-15T10:11:20","slug":"python-qt-menu-%eb%a7%8c%eb%93%a4%ea%b8%b0","status":"publish","type":"post","link":"http:\/\/batmask.net\/index.php\/2020\/05\/15\/549\/","title":{"rendered":"Python : Qt menu \ub9cc\ub4e4\uae30"},"content":{"rendered":"\n<p>\uc708\ub3c4\uc6b0\ub97c \uc0dd\uc131\ud558\uace0 \uac00\uc7a5 \uae30\ubcf8\uc801\uc73c\ub85c \uc0dd\uc131\ud558\ub294 \uacf5\ud1b5 \uc791\uc5c5\uc774 \uba54\ub274\ub9cc\ub4e4\uae30\uc77c \uac83\uc774\ub2e4. \uac04\ub2e8\ud558\uac8c \uba54\ub274\uc5d0 \ub300\ud574 \uc54c\uc544\ubcf4\ub824\ud55c\ub2e4.<\/p>\n\n\n\n<p>QMainWindow \ub294 \ub2e4\uc74c\uacfc \uac19\uc774 \uc601\uc5ed\uc774 \uad6c\ubd84\ub418\uc5b4 \uc788\ub2e4. ( <a href=\"https:\/\/doc.qt.io\/qtforpython\/PySide2\/QtWidgets\/QMainWindow.html\">Qt \uacf5\uc2dd\ubb38\uc11c \ucc38\uc870<\/a> )<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"347\" height=\"314\" src=\"http:\/\/batmask.dothome.co.kr\/wordpress\/wp-content\/uploads\/2020\/05\/mainwindowlayout.png\" alt=\"\" class=\"wp-image-551\" srcset=\"http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/05\/mainwindowlayout.png 347w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/05\/mainwindowlayout-300x271.png 300w\" sizes=\"auto, (max-width: 347px) 100vw, 347px\" \/><\/figure><\/div>\n\n\n\n<p>\uadf8\ub9bc\uc5d0 \ubcf4\uc774\ub4ef\uc774 \uba54\ub274\ub294 \uc0c1\ub2e8\uc758 Menu Bar \uc601\uc5ed\uc5d0 \uba54\ub274\uac00 \ub9cc\ub4e4\uc5b4\uc9c4\ub2e4. <\/p>\n\n\n\n<p>\uba54\ub274\ub97c \ub9cc\ub4dc\ub294 \uc791\uc5c5\uc740 \ub2e4\uc74c\uacfc \uac19\uc740 \uacfc\uc815\uc73c\ub85c \uc774\ub8e8\uc5b4\uc9c4\ub2e4.<\/p>\n\n\n\n<ol class=\"wp-block-list\" style=\"color:#0693e3\"><li><strong>\uba54\ub274\ubc14\ub97c \ub9cc\ub4e0\ub2e4.<\/strong><\/li><li><strong>File, Edit \uac19\uc740 \ucd5c\uc0c1\uc704(\ud31d\uc5c5) \uba54\ub274\ub97c \ucd94\uac00\ud55c\ub2e4.<\/strong> <\/li><li><strong>\uc11c\ube0c\uba54\ub274\ub294 QAction\uc744 \uc0dd\uc131\ud574\uc11c \ud560\ub2f9\ud574\uc900\ub2e4.<\/strong><\/li><\/ol>\n\n\n\n<p>\uba54\ub274\ubc14\ub97c \ub2e4\ub8e8\uae30 \uc804\uc5d0, \uc9c0\uae08\uae4c\uc9c0 Qt\uc5d0 \ub300\ud574 \uc81c\ub300\ub85c \ub2e4\ub8ec\uc801\uc774 \uc5c6\uc73c\ubbc0\ub85c \uae30\ubcf8 \uc708\ub3c4\uc6b0\ubd80\ud130 \uc2dc\uc791\ud574 \ubcf4\uaca0\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">import sys\nfrom PySide2.QtWidgets import QMainWindow, QApplication\n\n\nclass MenubarWindow(QMainWindow):\n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs) # parent, window flags\n        self._init_ui()\n\n    def _init_ui(self):\n        self.setWindowTitle(\"Menubar Test\")\n        self.setGeometry(200, 300, 640, 480)\n\n\ndef main():\n    app = QApplication(sys.argv)\n    main_window = MenubarWindow()\n    main_window.show()\n\n    sys.exit(app.exec_())\n\n\nif __name__ == \"__main__\":\n    main()\n<\/code><\/pre>\n\n\n\n<p>main \ud568\uc218\ub97c \ubcf4\uba74, QApplication\uc5d0 \ucee4\ub9e8\ub4dc\ub77c\uc778 \uc778\uc790\ub97c \ub118\uaca8 \uc0dd\uc131\ud55c\ub2e4. \uc774\uac83\uc774 Qt\uc758 \ubcf8\uccb4\uc774\ub2e4. \uadf8 \ub2e4\uc74c, QMainWindow\ub97c \uc0c1\uc18d\ud55c MenubarWindow()\ub97c \uc0dd\uc131\ud558\uace0 show()\ub97c \ubd88\ub7ec\uc900\ub2e4. \ub9c8\uc9c0\ub9c9\uc73c\ub85c app.exec_()\ub97c \uc2e4\ud589\ud574\uc8fc\ub294\ub370, \ubaa8\ub4e0 UI \ubc0f \uc774\ubca4\ud2b8 \uc2dc\uc2a4\ud15c\uc774 \uadf8\ub807\ub4ef \uc774\ubca4\ud2b8\uc5d0 \ubc18\uc751\ud558\ub294 \ubb34\ud55c\ub8e8\ud504\uac00 \ub3cc\uac8c\ub41c\ub2e4. \ubaa8\ub4e0 \uc708\ub3c4\uc6b0\uac00 \uc885\ub8cc \uc774\ubca4\ud2b8\ub97c \ubc1b\uc558\uc744 \ub54c \uc885\ub8cc\ub418\ub294\ub370, \uaf2d \ud544\uc694\ud55c\uac74 \uc544\ub2c8\uc9c0\ub9cc \uc2dc\uc2a4\ud15c\uc5d0 exit code\ub97c \uc804\ub2ec\ud558\uba70 \uc885\ub8cc\ud558\uace0 \uc788\ub2e4. <br>Window\ub97c \uc0dd\uc131\ud558\uace0 \ub530\ub85c \ub4f1\ub85d\ud574\uc8fc\ub294 \uc791\uc5c5\uc774 \ubcf4\uc774\uc9c0 \uc54a\ub294\uac78\ub85c \ucd94\uce21\ucee8\ub370, QMainWindow\ub97c \uc0c1\uc18d\ubc1b\uc73c\uba74 \uadf8 \uc0dd\uc131\uc790 \uc548\uc5d0\uc11c QApplication\uc5d0 \uc708\ub3c4\uc6b0\ub97c \ub4f1\ub85d\ud558\ub294 \ucf54\ub4dc\uac00 \uc788\uc744 \uac83\uc774\ub2e4.<\/p>\n\n\n\n<p>QMainWindow\ub97c \uc0c1\uc18d\ubc1b\uc740 MenubarWindow\uc5d0\uc11c\ub294 setWindowTitle()\uacfc setGeometry()\ub85c \uc708\ub3c4\uc6b0\uc758 \ud0c0\uc774\ud2c0\uacfc \uc0ac\uc774\uc988\ub97c \uc815\ud574\uc8fc\uace0 \uc788\ub2e4. \ub2e4\ub978 \uc791\uc5c5\uc774 \uc5c6\uc5b4\ub3c4 \uac00\uc7a5 \uae30\ubcf8\uc801\uc778 \uc791\uc5c5\uc77c \uac83\uc774\ub2e4. \uadf8 \uacb0\uacfc\ubb3c\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"686\" height=\"550\" src=\"http:\/\/batmask.dothome.co.kr\/wordpress\/wp-content\/uploads\/2020\/05\/qt_base_window.png\" alt=\"\" class=\"wp-image-552\" srcset=\"http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/05\/qt_base_window.png 686w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/05\/qt_base_window-300x241.png 300w\" sizes=\"auto, (max-width: 686px) 100vw, 686px\" \/><\/figure>\n\n\n\n<p>\uc774\uc81c \uba54\ub274\ubc14\ub97c \ub9cc\ub4e4\uc5b4\ubcf4\uc790. \uc704\uc758 \uc708\ub3c4\uc6b0 \ucf54\ub4dc\uc5d0\uc11c \ucd94\uac00\ub41c \ubd80\ubd84\ub9cc \uc0b4\ud3b4\ubcf4\uba74 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">    def _ui_menu(self):\n        self.statusBar()\n\n        menubar = self.menuBar()\n        filemenu = menubar.addMenu(\"&amp;File\")\n\n        exit_action = QAction(QIcon(\"..\/resources\/exit_kr.png\"), \"E&amp;xit\", self)\n        exit_action.setShortcut(QKeySequence(Qt.CTRL + Qt.Key_Q))\n        exit_action.setStatusTip(\"Exit application window\")\n        exit_action.triggered.connect(self.my_exit)\n        filemenu.addAction(exit_action)\n\n    def my_exit(self):\n        print(\"menu exit !!\")\n        QApplication.quit()<\/code><\/pre>\n\n\n\n<p>self.statusBar()\ub294 \uc81c\uc77c \uccab \uadf8\ub9bc\uc5d0\uc11c \ubd24\ub4ef\uc774 \uc708\ub3c4\uc6b0 \ud558\ub2e8\uc758 status bar\ub97c \uc0dd\uc131\ud558\ub294 \ucf54\ub4dc\uc774\ub2e4. <\/p>\n\n\n\n<p>\uba54\ub274\ubc14\ub97c \uc0dd\uc131\ud558\ub294 \ubd80\ubd84\uc740 self.menuBar()\ub85c \uba54\ub274\ubc14\ub97c \uac00\uc838\uc624\uace0, addMenu\ub85c \ucd5c\uc0c1\uc704 \uba54\ub274\ub97c \ucd94\uac00\ud55c\ub2e4. addMenu\ub85c \ucd94\uac00\ub41c \ud56d\ubaa9\uc740 \uc790\uae30\uc790\uc2e0\uc740 \ud558\ub294\uc77c\uc774 \uc5c6\uace0 \uc11c\ube0c\uba54\ub274\ub97c \ud31d\uc5c5\uc2dc\ud0a4\ub294 \uc5ed\ud560\uc744 \ud55c\ub2e4. \uba54\ub274 \ubc11\uc5d0 \ucd94\uac00\uc801\uc778 \uc11c\ube0c\uba54\ub274\ub97c \ub9cc\ub4e4\uace0 \uc2f6\uc73c\uba74 \uc774 \uba54\uc18c\ub4dc\ub97c \uc774\uc6a9\ud558\uba74 \ub41c\ub2e4.<\/p>\n\n\n\n<p>\uc2e4\uc81c \ub3d9\uc791\ud558\ub294 \uba54\ub274\ub97c \ucd94\uac00\ud558\ub824\uba74 QAction\uc744 \ub9cc\ub4e4\uc5b4\uc57c \ud55c\ub2e4. QAction\uc758 \uac1c\ub150\uc740 \uba54\ub274\ubc14, \ud234\ubc14\ub4f1 \uc5b4\ub290 \uacf3\uc5d0\uc11c\ub4e0 \ub3d9\uc77c\ud55c \ub3d9\uc791\uc744 \uc218\ud589\ud558\uae30 \uc704\ud574 \ub9cc\ub4e4\uc5b4\uc9c4 \ud074\ub798\uc2a4\uc774\ub2e4. \ucee4\ub9e8\ub4dc \ud328\ud134\uc758 \ucee4\ub9e8\ub4dc\ub85c \uc0dd\uac01\ud558\uba74 \uc26c\uc6b8 \uac83 \uac19\ub2e4. \uc778\uc790\ub85c\ub294 QIcon, name, parent\uac00 \ub4e4\uc5b4\uac04\ub2e4. <br> setShortcut()\uc744 \uc774\uc6a9\ud574\uc11c \ub2e8\ucd95\ud0a4\ub3c4 \uc9c0\uc815\uc774 \uac00\ub2a5\ud558\uace0, setStatusTip\uc744 \uc124\uc815\ud558\uba74 \uba54\ub274\uac00 \uc120\ud0dd\ub410\uc744 \ub54c, status bar\uc5d0 \uc124\uba85\uc774 \ud45c\uc2dc\ub41c\ub2e4. \ub9c8\uc9c0\ub9c9\uc73c\ub85c \uba54\ub274\uac00 \uc2e4\ud589\ub420 \ub54c \ub3d9\uc791\uc744 \uc704\ud574\uc11c triggered \uc2dc\uadf8\ub110\uc744 \uac00\uc9c0\uace0 \uc788\uc73c\uba70 \uc5ec\uae30\uc5d0 connect\ub97c \uc774\uc6a9\ud558\uc5ec slot \uba54\uc18c\ub4dc\ub97c \uc5f0\uacb0\ud55c\ub2e4. \ucf54\ub4dc\uc5d0\uc11c\ub294 my_exit()\uac00 \uc774\uc5d0 \ud574\ub2f9\ud55c\ub2e4. <\/p>\n\n\n\n<p>\uc2e4\ud589\uacb0\uacfc\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"677\" height=\"529\" src=\"http:\/\/batmask.dothome.co.kr\/wordpress\/wp-content\/uploads\/2020\/05\/qt_base_menubar.png\" alt=\"\" class=\"wp-image-554\" srcset=\"http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/05\/qt_base_menubar.png 677w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/05\/qt_base_menubar-300x234.png 300w\" sizes=\"auto, (max-width: 677px) 100vw, 677px\" \/><\/figure>\n\n\n\n<p>File\uc758 \uc11c\ube0c\uba54\ub274\ub85c Exit\uac00 \ubcf4\uc774\uba70, QAction\uc5d0\uc11c \uc124\uc815\ud55c \uc544\uc774\ucf58\uacfc \ub2e8\ucd95\ud0a4\ub3c4 \ubcf4\uc778\ub2e4. \ud558\ub2e8 status bar\uc5d0\ub294 \uc124\uc815\ud55c \ubb38\uad6c\uac00 \ucd9c\ub825\ub418\uace0 \uc788\ub2e4. \ucf58\uc194 \ucd9c\ub825\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"rest\" class=\"language-rest\">menu exit !!\n\nProcess finished with exit code 0<\/code><\/pre>\n\n\n\n<p>\uba54\ub274\uc758 triggered \uc2dc\uadf8\ub110\uc5d0 \uc5f0\uacb0\ud55c \uc2ac\ub86f\uc778 my_exit()\uac00 \uc2e4\ud589\ub418\ub294\uac78 \ud655\uc778 \ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator is-style-dots\"\/>\n\n\n\n<p>Python Qt \uba54\ub274\uc0dd\uc131\uc5d0 \ub300\ud574 \uae30\ubcf8\uc801\uc778 \uac78 \uc815\ub9ac\ud574\ubd24\ub2e4. \uc774\ub97c \ubc14\ud0d5\uc73c\ub85c \uc804\uccb4 \uba54\ub274\ub97c \ub9cc\ub4e4 \uc218 \uc788\uc744 \uac83\uc774\ub2e4. \uba54\ub274\ubc14\ub294 \ub300\ubd80\ubd84 \ube44\uc2b7\ud558\uace0 \uae30\ub2a5\uc774 \ucd94\uac00\ub418\ub294 \ud615\ud0dc\uc774\ubbc0\ub85c \ud15c\ud50c\ub9bf\ucc98\ub7fc \ud558\ub098 \ub9cc\ub4e4\uc5b4 \ub193\uc73c\uba74 \uc7ac\ud65c\uc6a9\uc774 \uac00\ub2a5\ud560 \uac83\uc73c\ub85c \ubcf4\uc778\ub2e4.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\uc708\ub3c4\uc6b0\ub97c \uc0dd\uc131\ud558\uace0 \uac00\uc7a5 \uae30\ubcf8\uc801\uc73c\ub85c \uc0dd\uc131\ud558\ub294 \uacf5\ud1b5 \uc791\uc5c5\uc774 \uba54\ub274\ub9cc\ub4e4\uae30\uc77c \uac83\uc774\ub2e4. \uac04\ub2e8\ud558\uac8c \uba54\ub274\uc5d0 \ub300\ud574 \uc54c\uc544\ubcf4\ub824\ud55c\ub2e4. QMainWindow \ub294 \ub2e4\uc74c\uacfc \uac19\uc774 \uc601\uc5ed\uc774 \uad6c\ubd84\ub418\uc5b4 \uc788\ub2e4. ( Qt \uacf5\uc2dd\ubb38\uc11c \ucc38\uc870 ) \uadf8\ub9bc\uc5d0 \ubcf4\uc774\ub4ef\uc774 \uba54\ub274\ub294 \uc0c1\ub2e8\uc758 Menu Bar \uc601\uc5ed\uc5d0 \uba54\ub274\uac00 \ub9cc\ub4e4\uc5b4\uc9c4\ub2e4. \uba54\ub274\ub97c \ub9cc\ub4dc\ub294 \uc791\uc5c5\uc740 \ub2e4\uc74c\uacfc \uac19\uc740 \uacfc\uc815\uc73c\ub85c \uc774\ub8e8\uc5b4\uc9c4\ub2e4. \uba54\ub274\ubc14\ub97c \ub9cc\ub4e0\ub2e4. File, Edit \uac19\uc740 \ucd5c\uc0c1\uc704(\ud31d\uc5c5) \uba54\ub274\ub97c \ucd94\uac00\ud55c\ub2e4. \uc11c\ube0c\uba54\ub274\ub294 <a href=\"http:\/\/batmask.net\/index.php\/2020\/05\/15\/549\/\" class=\"btn btn-link continue-link\">\ub354 \uc77d\uae30<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[33],"tags":[170,172,171,35,173,56,55],"class_list":["post-549","post","type-post","status-publish","format-standard","hentry","category-python","tag-menu","tag-menu-bar","tag-menubar","tag-python","tag-qaction","tag-qt","tag-python-kr"],"jetpack_featured_media_url":"","_links":{"self":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts\/549","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/comments?post=549"}],"version-history":[{"count":4,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts\/549\/revisions"}],"predecessor-version":[{"id":556,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts\/549\/revisions\/556"}],"wp:attachment":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/media?parent=549"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/categories?post=549"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/tags?post=549"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}