Dork's port

pyqt를 이용한 QTreeWidget 이용 및 리스트 간 항목 이동 구현하기 본문

Develop

pyqt를 이용한 QTreeWidget 이용 및 리스트 간 항목 이동 구현하기

Dork94 2019. 4. 13. 03:19

결과 화면

 

 

GUI 공부를 위해서 pyqt를 사용하고 있는데, top-down 방식으로 공부하려니 여간 쉽지가 않다. 

 

구성이 모든 class로 이뤄져있고, 객체간의 관계가 복잡해서 document를 정독하고 나서야 겨우 구현에 성공했다.

 

소스 코드는 다음과 같다.

 

import sys
from PyQt5.QtWidgets import QApplication, QWidget,QDesktopWidget,QPushButton, QBoxLayout,QTreeWidget,QTreeWidgetItem

__auther__='d0rk'

class my_app(QWidget):
    def __init__(self):
        super().__init__()

        self.add_btn=QPushButton('추가')
        self.del_btn=QPushButton('삭제')
        self.wishlist=QTreeWidget(self)
        self.lecture_list=QTreeWidget(self)

        self.initUI()



    def initUI(self):
        self.setWindowTitle('QTree example')

        self.init_lectures()

        self.resize(800, 480)
        self.center()
        self.show()

    def center(self):
        qr = self.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())


    def init_lectures(self):
        headers = ['과목','시간','캠퍼스','강의실','교수명']

        self.lecture_list.setColumnCount(len(headers))
        self.lecture_list.setHeaderLabels(headers)

        self.wishlist.setColumnCount(len(headers))
        self.wishlist.setHeaderLabels(headers)


        list_layout = QBoxLayout(QBoxLayout.LeftToRight)
        list_layout.addWidget(self.lecture_list)
        list_layout.addWidget(self.wishlist)

        lecture_root = QTreeWidget.invisibleRootItem(self.lecture_list)

        datas = ['하','이','루','방','가']
        item = QTreeWidgetItem()
        for idx, data in enumerate(datas):
            item.setText(idx, data)

        lecture_root.addChild(item)

        datas = ['바','이','루','방','가']
        item = QTreeWidgetItem()
        for idx, data in enumerate(datas):
            item.setText(idx, data)

        lecture_root.addChild(item)

        datas = ['D', '0', 'R', 'K', '_']
        item = QTreeWidgetItem()
        for idx, data in enumerate(datas):
            item.setText(idx, data)

        lecture_root.addChild(item)

        btn_layout = QBoxLayout(QBoxLayout.RightToLeft)
        btn_layout.addWidget(self.add_btn)
        btn_layout.addWidget(self.del_btn)

        main_layout = QBoxLayout(QBoxLayout.TopToBottom)
        main_layout.addLayout(list_layout)
        main_layout.addLayout(btn_layout)

        self.add_btn.clicked.connect(self.move_item)
        self.del_btn.clicked.connect(self.move_item)

        self.setLayout(main_layout)
        return main_layout


    def move_item(self):
        sender = self.sender()

        if self.add_btn == sender:
            source = self.lecture_list
            target = self.wishlist
        else:
            source = self.wishlist
            target = self.lecture_list

        item = QTreeWidget.invisibleRootItem(source).takeChild(source.currentIndex().row())
        QTreeWidget.invisibleRootItem(target).addChild(item)


if __name__=='__main__':

    app = QApplication(sys.argv)
    ex = my_app()
    sys.exit(app.exec_())

 

소스코드는 https://github.com/JangHanbin/pyqt_QtreeWidget 다운받을 수 있다.

 

구글에도 위와 같은 형태에 대해 많은 자료가 없어서 삽질 많이 했다 :( 

 

 

Comments