问题描述
下面是我的示例代码:
from PyQt5 import QtCore,QtGui,QtWidgets
class Ui_Form(object):
def setupUi(self,Form):
Form.setobjectName("Form")
Form.resize(691,327)
self.listWidget = QtWidgets.QListWidget(Form)
self.listWidget.setGeometry(QtCore.QRect(70,40,256,192))
self.listWidget.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
self.listWidget.setobjectName("listWidget")
self.plainTextEdit = QtWidgets.QPlainTextEdit(Form)
self.plainTextEdit.setGeometry(QtCore.QRect(360,261,191))
self.plainTextEdit.setTabChangesFocus(True)
self.plainTextEdit.setReadOnly(True)
self.plainTextEdit.setobjectName("plainTextEdit")
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
lists = ["one","two","Three"]
for i in lists:
item = QtWidgets.QListWidgetItem(i)
item.setFlags(item.flags() | QtCore.Qt.ItemIsUserCheckable)
item.setCheckState(QtCore.Qt.Unchecked)
self.listWidget.addItem(item)
self.listWidget.itemClicked.connect(self.on_listWidget_itemClicked)
def on_listWidget_itemClicked(self,item):
lines = self.plainTextEdit.toPlainText()
line_list = []
#if item.listWidget().itemWidget(item) != None:
if item.checkState() == QtCore.Qt.Checked:
self.plainTextEdit.appendplainText(item.text())
elif item.checkState() == QtCore.Qt.Unchecked:
print(item.text())
def retranslateUi(self,Form):
_translate = QtCore.QCoreApplication.translate
Form.setwindowTitle(_translate("Form","Form"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
ui = Ui_Form()
ui.setupUi(Form)
Form.show()
sys.exit(app.exec_())
在此示例中,我将QListWidget与ItemIsUserCheckable和QPlainTextEdit一起使用。我可以使用CheckBoxes将项目从Qlistwidget转到QPlainTextEdit。如果我检查Qlistwidget中的项目,则可以将文本设置为QPlaintextEdit。但是,当我取消选中项目框时,我想在QplainTextEdit中删除或删除相同的文本。例如,如果我在Qlistwidget中选中项目“ one”,则将其设置为QplainTextEdit,当我取消选中该项目时,应删除同一项目。可以怎么办?
解决方法
请勿修改Qt Designer生成的代码,而是创建另一个继承的类 从适当的小部件中添加并使用初始类填充它。
from PyQt5 import QtCore,QtGui,QtWidgets
class Ui_Form(object):
def setupUi(self,Form):
Form.setObjectName("Form")
Form.resize(691,327)
self.listWidget = QtWidgets.QListWidget(Form)
self.listWidget.setGeometry(QtCore.QRect(70,40,256,192))
self.listWidget.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
self.listWidget.setObjectName("listWidget")
self.plainTextEdit = QtWidgets.QPlainTextEdit(Form)
self.plainTextEdit.setGeometry(QtCore.QRect(360,261,191))
self.plainTextEdit.setTabChangesFocus(True)
self.plainTextEdit.setReadOnly(True)
self.plainTextEdit.setObjectName("plainTextEdit")
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self,Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form","Form"))
class MainWindow(QtWidgets.QWidget,Ui_Form):
def __init__(self):
super().__init__()
self.setupUi(self)
lists = ["one","two","Three"]
for i in lists:
item = QtWidgets.QListWidgetItem(i)
item.setFlags(item.flags() | QtCore.Qt.ItemIsUserCheckable)
item.setCheckState(QtCore.Qt.Unchecked)
self.listWidget.addItem(item)
# self.listWidget.itemClicked.connect(self.on_listWidget_itemClicked)
def on_listWidget_itemClicked(self,item):
if item.checkState() == QtCore.Qt.Checked:
self.plainTextEdit.appendPlainText(item.text())
elif item.checkState() == QtCore.Qt.Unchecked:
text = self.plainTextEdit.toPlainText() # 1
text = text.replace(item.text(),'') # 2
_list = text.split() # 3
text = '\n'.join(_list) # 4
self.plainTextEdit.setPlainText(text) # 5
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
Form = MainWindow() #QtWidgets.QWidget()
# ui = Ui_Form()
# ui.setupUi(Form)
Form.show()
sys.exit(app.exec_())
更新
并且仅在选中复选框时我们可以这样做吗?我的意思是,在选中复选框时,文本应附加到Plaintextedit中。但是即使选择了该项目,它也会追加它。
对不起,我忘了在问题中再添加一件事。有时,列表不仅包含单个单词,而且还包含两个两个单词,例如名字和姓氏,例如
lists = ["Fname1 Lname1","Fname2 Lname2","Fname3 LName3"]
。我们可以这样吗?
from PyQt5 import QtCore,Ui_Form):
def __init__(self):
super().__init__()
self.setupUi(self)
self.lists = { # !!! self.lists = {...}
"Fname1 Lname1": 0,"Fname2 Lname2": 0,"Fname3 LName3": 0
}
# lists = ["one","Three"]
for i in self.lists.keys(): # + .keys()
item = QtWidgets.QListWidgetItem(i)
item.setFlags(item.flags() | QtCore.Qt.ItemIsUserCheckable)
item.setCheckState(QtCore.Qt.Unchecked)
self.listWidget.addItem(item)
# self.listWidget.itemClicked.connect(self.on_listWidget_itemClicked)
def on_listWidget_itemClicked(self,item):
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvv
if item.checkState() == QtCore.Qt.Checked and self.lists[item.text()] == 0:
self.plainTextEdit.appendPlainText(item.text())
self.lists[item.text()] = 1 # +
elif item.checkState() == QtCore.Qt.Unchecked:
text = self.plainTextEdit.toPlainText()
text = text.replace(item.text(),'')
# _list = text.split()
_list = text.split('\n') # + '\n'
_list = [ i for i in _list if i ] # +
text = '\n'.join(_list)
self.plainTextEdit.setPlainText(text)
self.lists[item.text()] = 0 # +
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
Form = MainWindow()
Form.show()
sys.exit(app.exec_())