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)
댓글 입력