PYTHON QTableWidget에 데이터 출력후 ctrl+c 기능 이용해 multi item을 복사해서 다른곳에 붙여넣기 하고 싶습니다.

조회수 5576회

제목에 많은게 반영됐는데요

쿼리 결과를 QTableWidget에 출력했습니다.

그 결과물중 일정부분을 마우스로 drag하여 선택후 ctrl+ C 하고

노트패드나 엑셀시트에 ctrl + v 해도 원하는 만큼의 아이템이 아니라

한개의 아이템만 복사가 됩니다.

stackoverflow 봐도 잘 해결이 되지 않아 질문 올립니다.

방법좀 알려주세요~

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 위젯에서 그런기능이 제공 안되네요.

    테이블위젯에 keypressevent 등록하고 ctrl+c 일때 항목을 복사하여 클립보드에 넣어주는 형태로 구현해야 합니다.

    테스트해본 예제를 올려드립니다.

    import sys
    import io
    import csv
    from PyQt5.Qt import *
    from PyQt5.QtCore import *
    from PyQt5.QtWidgets import *
    
    data = {'col1':['1','2','3'], 'col2':['4','5','6'], 'col3':['7','8','9']}
    
    class MyTable(QTableWidget):
        def __init__(self, data, *args):
            QTableWidget.__init__(self, *args)
            self.data = data
            self.setmydata()
            self.resizeColumnsToContents()
            self.resizeRowsToContents()
            self.setSelectionMode(QAbstractItemView.ExtendedSelection)
    
        def setmydata(self):
    
            horHeaders = []
            for n, key in enumerate(sorted(self.data.keys())):
                horHeaders.append(key)
                for m, item in enumerate(self.data[key]):
                    newitem = QTableWidgetItem(item)
                    self.setItem(m, n, newitem)
            self.setHorizontalHeaderLabels(horHeaders)
    
        def keyPressEvent(self, ev):
            if (ev.key() == Qt.Key_C) and (ev.modifiers() & Qt.ControlModifier): 
                self.copySelection()
    
        def copySelection(self):
            selection = self.selectedIndexes()
            if selection:
                rows = sorted(index.row() for index in selection)
                columns = sorted(index.column() for index in selection)
                rowcount = rows[-1] - rows[0] + 1
                colcount = columns[-1] - columns[0] + 1
                table = [[''] * colcount for _ in range(rowcount)]
                for index in selection:
                    row = index.row() - rows[0]
                    column = index.column() - columns[0]
                    table[row][column] = index.data()
                stream = io.StringIO()
                csv.writer(stream).writerows(table)
                QApplication.clipboard().setText(stream.getvalue())
    
    
    def main(args):
        app = QApplication(args)
        table = MyTable(data, 5, 3)
        table.show()
        sys.exit(app.exec_())
    
    if __name__=="__main__":
        main(sys.argv)
    
    • 예제 샘플로는 잘되는데 정작 제 코드에서는 안먹히네요~~ 감사합니다~방법을 이 틀안에서 다시 찾아보겠습니다 알 수 없는 사용자 2017.4.26 09:47

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)