컴퓨터/Python
pyqt5 listwidget to listwidget
풍경소리^^
2022. 6. 22. 09:41
listwidgettolistwidgetrename.py--------------------
import sys
# from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QListWidget, QGridLayout, \
QHBoxLayout, QVBoxLayout, QSizePolicy, QAbstractItemView
from PyQt5.QtCore import Qt
class MyApp(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("Moving Items Between List Widgets")
self.window_width, self.window_height = 1200, 800
self.setMinimumSize(self.window_width, self.window_height)
self.initUI()
self.updateButtonStatus()
self.setButtonConnections()
def initUI(self):
layout = QHBoxLayout()
self.setLayout(layout)
# subLayouts = {}
# subLayouts['LeftColumn'] = QGridLayout()
# subLayouts['RightColumn'] = QVBoxLayout()
# self.layout.addLayout(subLayouts['LeftColumn'], 1)
# self.layout.addLayout(subLayouts['RightColumn'], 1)
layout_leftcolumn = QGridLayout()
layout_rightcolumn = QVBoxLayout()
layout.addLayout(layout_leftcolumn)
layout.addLayout(layout_rightcolumn)
self.buttons = {}
self.buttons['>>'] = QPushButton('&>>')
self.buttons['>'] = QPushButton('>')
self.buttons['<'] = QPushButton('<')
self.buttons['<<'] = QPushButton('&<<')
# self.buttons['Up'] = QPushButton('&Up')
# self.buttons['Down'] = QPushButton('&Down')
for k in self.buttons:
self.buttons[k].setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed)
"""
First Column
"""
self.listWidgetLeft = QListWidget()
# self.listWidgetLeft.setSelectionMode(2) # 여러행 선택
self.listWidgetLeft.setSelectionMode(QAbstractItemView.MultiSelection)
# ====================== 더미 데이터
str = "ABCDEFGHIJK"
my_list = list(str)
for i in enumerate(my_list):
self.listWidgetLeft.addItem('Item {0}'.format(i[1]))
# for i in range(10):
# self.listWidgetLeft.addItem('Item {0}'.format(list("ABCDEFGHIJK")[i]))
# ====================== 더미 데이터
layout_leftcolumn.addWidget(self.listWidgetLeft, 1, 0, 4, 4)
layout_leftcolumn.setRowStretch(4, 1)
layout_leftcolumn.addWidget(self.buttons['>>'], 1, 4, 1, 1, alignment=Qt.AlignTop)
layout_leftcolumn.addWidget(self.buttons['>'], 2, 4, 1, 1, alignment=Qt.AlignTop)
layout_leftcolumn.addWidget(self.buttons['<'], 3, 4, 1, 1, alignment=Qt.AlignTop)
layout_leftcolumn.addWidget(self.buttons['<<'], 4, 4, 1, 1, alignment=Qt.AlignTop)
"""
Second Column
"""
self.listWidgetRight = QListWidget()
hLayout = QHBoxLayout()
layout_rightcolumn.addLayout(hLayout)
hLayout.addWidget(self.listWidgetRight)
# vLayout = QVBoxLayout()
# hLayout.addLayout(vLayout, 1)
# vLayout.addWidget(self.buttons['Up'])
# vLayout.addWidget(self.buttons['Down'])
# vLayout.addStretch(1)
def setButtonConnections(self):
self.listWidgetLeft.itemSelectionChanged.connect(self.updateButtonStatus)
self.listWidgetRight.itemSelectionChanged.connect(self.updateButtonStatus)
self.buttons['>'].clicked.connect(self.buttonAddClicked)
self.buttons['<'].clicked.connect(self.buttonRemoveClicked)
self.buttons['>>'].clicked.connect(self.buttonAddAllClicked)
self.buttons['<<'].clicked.connect(self.buttonRemoveAllClicked)
# self.buttons['Up'].clicked.connect(self.buttonUpClicked)
# self.buttons['Down'].clicked.connect(self.buttonDownClicked)
def buttonAddClicked(self):
itemsLeft = self.listWidgetLeft.selectedItems()
itemsRight = [str(self.listWidgetRight.item(i).text()) for i in range(self.listWidgetRight.count())]
if len(itemsRight)==0:
for i in range(len(itemsLeft)):
self.listWidgetRight.addItem(itemsLeft[i].text())
else:
for i in range(len(itemsLeft)):
samecount = 0
for j in range(len(itemsRight)):
if itemsLeft[i].text() == itemsRight[j]:
samecount += 1
break
if samecount == 0:
self.listWidgetRight.addItem(itemsLeft[i].text())
self.listWidgetRight.setSortingEnabled(True)
def buttonRemoveClicked(self):
currentitemRight = self.listWidgetRight.currentItem()
currentrowRight = self.listWidgetRight.currentRow()
self.listWidgetRight.takeItem(currentrowRight) # currentrowRight번째 항목을 삭제합니다
# rowItem = self.listWidgetRight.takeItem(currentrowRight) # currentrowRight번째 항목을 삭제합니다
itemsLeft = self.listWidgetLeft.selectedItems()
for l in range(self.listWidgetLeft.count()):
if self.listWidgetLeft.item(l).text() == currentitemRight.text():
self.listWidgetLeft.item(l).setSelected(False)
break
def buttonAddAllClicked(self):
itemsLeft = self.listWidgetLeft.selectAll()
items = self.listWidgetLeft.selectedItems()
for i in range(len(items)):
self.listWidgetRight.addItem(items[i].text())
def buttonRemoveAllClicked(self):
for i in range(self.listWidgetRight.count()):
# self.listWidgetLeft.addItem(self.listWidgetRight.takeItem(0))
self.listWidgetRight.takeItem(0)
self.listWidgetLeft.clearSelection()
# def buttonUpClicked(self):
# rowIndex = self.listWidgetRight.currentRow()
# currentItem = self.listWidgetRight.takeItem(rowIndex)
# self.listWidgetRight.insertItem(rowIndex - 1, currentItem)
# self.listWidgetRight.setCurrentRow(rowIndex - 1)
# def buttonDownClicked(self):
# rowIndex = self.listWidgetRight.currentRow()
# currentItem = self.listWidgetRight.takeItem(rowIndex)
# self.listWidgetRight.insertItem(rowIndex + 1, currentItem)
# self.listWidgetRight.setCurrentRow(rowIndex + 1)
def updateButtonStatus(self):
# self.buttons['Up'].setDisabled(not bool(self.listWidgetRight.selectedItems()) or self.listWidgetRight.currentRow() == 0)
# self.buttons['Down'].setDisabled(not bool(self.listWidgetRight.selectedItems()) or self.listWidgetRight.currentRow() == self.listWidgetRight.count() - 1)
self.buttons['>'].setDisabled(not bool(self.listWidgetLeft.selectedItems()) or self.listWidgetLeft.count() == 0)
self.buttons['<'].setDisabled(not bool(self.listWidgetRight.selectedItems()) or self.listWidgetRight.count() == 0)
if __name__ == '__main__':
# don't auto scale when drag app to a different monitor.
# QApplication.setAttribute(Qt.HighDpiScaleFactorRoundingPolicy.PassThrough)
app = QApplication(sys.argv)
app.setStyleSheet('''
QWidget {
font-size: 30px;
}
QPushButton {
color: white;
background-color: rgb(58, 134, 255);
border-radius: 5px;
}
''')
myApp = MyApp()
myApp.show()
try:
sys.exit(app.exec_())
except SystemExit:
print('Closing Window...')
listwidgettolistwidget.py--------------------
import sys
# from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QListWidget, QGridLayout, \
QHBoxLayout, QVBoxLayout, QSizePolicy, QAbstractItemView
from PyQt5.QtCore import Qt
class MyApp(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("Moving Items Between List Widgets")
self.window_width, self.window_height = 1200, 800
self.setMinimumSize(self.window_width, self.window_height)
self.layout = QHBoxLayout()
self.setLayout(self.layout)
self.initUI()
str = "ABCDEFGHIJK"
my_list = list(str)
for i in enumerate(my_list):
self.listWidgetLeft.addItem('Item {0}'.format(i[1]))
# for i in range(10):
# self.listWidgetLeft.addItem('Item {0}'.format(list("ABCDEFGHIJK")[i]))
self.updateButtonStatus()
self.setButtonConnections()
def initUI(self):
subLayouts = {}
subLayouts['LeftColumn'] = QGridLayout()
subLayouts['RightColumn'] = QVBoxLayout()
self.layout.addLayout(subLayouts['LeftColumn'], 1)
self.layout.addLayout(subLayouts['RightColumn'], 1)
self.buttons = {}
self.buttons['>>'] = QPushButton('&>>')
self.buttons['>>'].setStyleSheet(
"color: white;"
"background-color: rgb(58, 134, 255);"
"border-radius: 5px;"
)
self.buttons['>'] = QPushButton('>')
self.buttons['>'].setStyleSheet(
"color: white;"
"background-color: rgb(58, 134, 255);"
"border-radius: 5px;"
)
self.buttons['<'] = QPushButton('<')
self.buttons['<'].setStyleSheet(
"color: white;"
"background-color: rgb(58, 134, 255);"
"border-radius: 5px;"
)
self.buttons['<<'] = QPushButton('&<<')
# self.buttons['<<'].setStyleSheet(
# "color: white;"
# "background-color: rgb(58, 134, 255);"
# "border-radius: 5px;"
# )
# self.buttons['Up'] = QPushButton('&Up')
# self.buttons['Up'].setStyleSheet(
# "color: white;"
# "background-color: rgb(58, 134, 255);"
# "border-radius: 5px;"
# )
# self.buttons['Down'] = QPushButton('&Down')
# self.buttons['Down'].setStyleSheet(
# "color: white;"
# "background-color: rgb(58, 134, 255);"
# "border-radius: 5px;"
# )
for k in self.buttons:
self.buttons[k].setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed)
"""
First Column
"""
self.listWidgetLeft = QListWidget()
# self.listWidgetLeft.setSelectionMode(2) # 여러행 선택
self.listWidgetLeft.setSelectionMode(QAbstractItemView.MultiSelection)
subLayouts['LeftColumn'].addWidget(self.listWidgetLeft, 1, 0, 4, 4)
subLayouts['LeftColumn'].setRowStretch(4, 1)
subLayouts['LeftColumn'].addWidget(self.buttons['>>'], 1, 4, 1, 1, alignment=Qt.AlignTop)
subLayouts['LeftColumn'].addWidget(self.buttons['<'], 2, 4, 1, 1, alignment=Qt.AlignTop)
subLayouts['LeftColumn'].addWidget(self.buttons['>'], 3, 4, 1, 1, alignment=Qt.AlignTop)
subLayouts['LeftColumn'].addWidget(self.buttons['<<'], 4, 4, 1, 1, alignment=Qt.AlignTop)
"""
Second Column
"""
self.listWidgetRight = QListWidget()
hLayout = QHBoxLayout()
subLayouts['RightColumn'].addLayout(hLayout)
hLayout.addWidget(self.listWidgetRight, 4)
# vLayout = QVBoxLayout()
# hLayout.addLayout(vLayout, 1)
# vLayout.addWidget(self.buttons['Up'])
# vLayout.addWidget(self.buttons['Down'])
# vLayout.addStretch(1)
def setButtonConnections(self):
self.listWidgetLeft.itemSelectionChanged.connect(self.updateButtonStatus)
self.listWidgetRight.itemSelectionChanged.connect(self.updateButtonStatus)
self.buttons['>'].clicked.connect(self.buttonAddClicked)
self.buttons['<'].clicked.connect(self.buttonRemoveClicked)
self.buttons['>>'].clicked.connect(self.buttonAddAllClicked)
self.buttons['<<'].clicked.connect(self.buttonRemoveAllClicked)
# self.buttons['Up'].clicked.connect(self.buttonUpClicked)
# self.buttons['Down'].clicked.connect(self.buttonDownClicked)
def buttonAddClicked(self):
itemsLeft = self.listWidgetLeft.selectedItems()
itemsRight = [str(self.listWidgetRight.item(i).text()) for i in range(self.listWidgetRight.count())]
if len(itemsRight)==0:
for i in range(len(itemsLeft)):
self.listWidgetRight.addItem(itemsLeft[i].text())
else:
for i in range(len(itemsLeft)):
samecount = 0
for j in range(len(itemsRight)):
if itemsLeft[i].text() == itemsRight[j]:
samecount += 1
break
if samecount == 0:
self.listWidgetRight.addItem(itemsLeft[i].text())
self.listWidgetRight.setSortingEnabled(True)
def buttonRemoveClicked(self):
currentitemRight = self.listWidgetRight.currentItem()
currentrowRight = self.listWidgetRight.currentRow()
self.listWidgetRight.takeItem(currentrowRight) # currentrowRight번째 항목을 삭제합니다
# rowItem = self.listWidgetRight.takeItem(currentrowRight) # currentrowRight번째 항목을 삭제합니다
itemsLeft = self.listWidgetLeft.selectedItems()
for l in range(self.listWidgetLeft.count()):
if self.listWidgetLeft.item(l).text() == currentitemRight.text():
self.listWidgetLeft.item(l).setSelected(False)
break
def buttonAddAllClicked(self):
itemsLeft = self.listWidgetLeft.selectAll()
items = self.listWidgetLeft.selectedItems()
for i in range(len(items)):
self.listWidgetRight.addItem(items[i].text())
def buttonRemoveAllClicked(self):
for i in range(self.listWidgetRight.count()):
# self.listWidgetLeft.addItem(self.listWidgetRight.takeItem(0))
self.listWidgetRight.takeItem(0)
self.listWidgetLeft.clearSelection()
# def buttonUpClicked(self):
# rowIndex = self.listWidgetRight.currentRow()
# currentItem = self.listWidgetRight.takeItem(rowIndex)
# self.listWidgetRight.insertItem(rowIndex - 1, currentItem)
# self.listWidgetRight.setCurrentRow(rowIndex - 1)
# def buttonDownClicked(self):
# rowIndex = self.listWidgetRight.currentRow()
# currentItem = self.listWidgetRight.takeItem(rowIndex)
# self.listWidgetRight.insertItem(rowIndex + 1, currentItem)
# self.listWidgetRight.setCurrentRow(rowIndex + 1)
def updateButtonStatus(self):
# self.buttons['Up'].setDisabled(not bool(self.listWidgetRight.selectedItems()) or self.listWidgetRight.currentRow() == 0)
# self.buttons['Down'].setDisabled(not bool(self.listWidgetRight.selectedItems()) or self.listWidgetRight.currentRow() == self.listWidgetRight.count() - 1)
self.buttons['>'].setDisabled(not bool(self.listWidgetLeft.selectedItems()) or self.listWidgetLeft.count() == 0)
self.buttons['<'].setDisabled(not bool(self.listWidgetRight.selectedItems()) or self.listWidgetRight.count() == 0)
if __name__ == '__main__':
# don't auto scale when drag app to a different monitor.
# QApplication.setAttribute(Qt.HighDpiScaleFactorRoundingPolicy.PassThrough)
app = QApplication(sys.argv)
app.setStyleSheet('''
QWidget {
font-size: 30px;
}
QPushButton {
color: white;
background-color: rgb(58, 134, 255);
border-radius: 5px;
}
''')
myApp = MyApp()
myApp.show()
try:
sys.exit(app.exec_())
except SystemExit:
print('Closing Window...')