본문 바로가기

Develop

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

결과 화면

 

 

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 다운받을 수 있다.

 

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

 

 

  • 화니 2019.07.25 00:00

    감사합니다 ..!

  • 화니 2019.07.25 00:04

    파이썬 공부하는 학생인데요.. 혹시 파이썬에서 아두이노센서같은 기기의 패킷을 받아 wireshark 처럼 분석하는 gui를 구현해보고 싶은데 pyqt5로 가능할까요? 아니면 다른 대안이 있을까요??.. 글 잘봤습니다 감사합니다 ㅎㅎ

    • Dork94 2019.07.25 00:06 신고

      충분히 가능할 것 같습니다. 다만 와이어샤크와 tcpdump, ssh를 이용해서 말씀 하신것 처럼 원격 패킷캡쳐가 이미 가능합니다.

  • Jackey 2019.07.30 19:46

    안녕하세요

    옮겨진 데이타를 mysql로 저장을 해야하는데. 데이타를 어떻게 읽어야 할지 모르겠네요. 마우스로 한개씩은 읽겠는데요. 한번에 모두 읽어서 저장하는 법을 모르겠습니다.
    질문이 적당한지 모르겠네요