python - PyQt5 删除按钮
问题描述
在 list_widget 我添加了一个添加按钮,我还想添加一个删除按钮,询问您要删除哪个项目并删除所选项目。我正在尝试这样做,但我不知道这样做。另外,请解释我是 pyqt5 的初学者的解决方案,或者我想说绝对的初学者。
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QApplication,QMainWindow,
QListWidget, QListWidgetItem
import sys
class MyWindow(QMainWindow):
def __init__(self):
super(MyWindow, self).__init__()
self.x = 200
self.y = 200
self.width = 500
self.length = 500
self.setGeometry(self.x, self.y, self.width,
self.length)
self.setWindowTitle("Stock managment")
self.iniTUI()
def iniTUI(self):
# buttons
self.b1 = QtWidgets.QPushButton(self)
self.b1.setText("+")
self.b1.move(450, 100)
self.b1.resize(50, 25)
self.b1.clicked.connect(self.take_inputs)
# This is the button I want to define.
self.btn_minus = QtWidgets.QPushButton(self)
self.btn_minus.setText("-")
self.btn_minus.move(0, 100)
self.btn_minus.resize(50, 25)
# list
self.list_widget = QListWidget(self)
self.list_widget.setGeometry(120, 100, 250, 300)
self.item1 = QListWidgetItem("A")
self.item2 = QListWidgetItem("B")
self.item3 = QListWidgetItem("C")
self.list_widget.addItem(self.item1)
self.list_widget.addItem(self.item2)
self.list_widget.addItem(self.item3)
self.list_widget.setCurrentItem(self.item2)
def take_inputs(self):
self.name, self.done1 =
QtWidgets.QInputDialog.getText(
self, 'Add Item to List', 'Enter The Item you want
in
the list:')
self.roll, self.done2 = QtWidgets.QInputDialog.getInt(
self, f'Quantity of {str(self.name)}', f'Enter
Quantity of {str(self.name)}:')
if self.done1 and self.done2:
self.item4 = QListWidgetItem(f"{str(self.name)}
Quantity{self.roll}")
self.list_widget.addItem(self.item4)
self.list_widget.setCurrentItem(self.item4)
def clicked(self):
self.label.setText("You clicked the button")
self.update()
def update(self):
self.label.adjustSize()
def clicked():
print("meow")
def window():
apk = QApplication(sys.argv)
win = MyWindow()
win.show()
sys.exit(apk.exec_())
window()
解决方案
这里的核心问题是视图和数据缺乏分离。这使得很难推断如何使用图形元素。您几乎肯定会想要遵循模型视图控制器设计范例https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller ,它提供了处理这种分离的系统方法。
一旦你这样做了,如何处理这个问题就变得非常直接了:你基本上只有一个列表,你要么想在这个列表中添加一个东西,要么根据选择删除一个东西。
我在这里包含一个示例,它恰好使用了 Qt5 中的内置类 QStringListModel 和 QListView,但是编写自己的更专业的小部件和模型很简单。它们都只是使用一个简单的信号来向视图发出它需要刷新活动信息。
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import sys
class StuffViewer(QMainWindow):
def __init__(self, model):
super().__init__()
self.setWindowTitle("Stock managment")
# 1: Use layouts.
hbox = QHBoxLayout()
widget = QWidget()
widget.setLayout(hbox)
self.setCentralWidget(widget)
# 2: Don't needlessly store things in "self"
vbox = QVBoxLayout()
add = QPushButton("+")
add.clicked.connect(self.add_new_stuff)
vbox.addWidget(add)
sub = QPushButton("-")
sub.clicked.connect(self.remove_selected_stuff)
vbox.addWidget(sub)
vbox.addStretch(1)
hbox.addLayout(vbox)
# 3: Separate the view of the data from the data itself. Use Model-View-Controller design to achieve this.
self.model = model
self.stuffview = QListView()
self.stuffview.setModel(self.model)
hbox.addWidget(self.stuffview)
def add_new_stuff(self):
new_stuff, success = QInputDialog.getText(self, 'Add stuff', 'Enter new stuff you want')
if success:
self.stuff.setStringList(self.stuff.stringList() + [new_stuff])
def remove_selected_stuff(self):
index = self.stuffview.currentIndex()
all_stuff = self.stuff.stringList()
del all_stuff[index.column()]
self.stuff.setStringList(all_stuff)
def window():
apk = QApplication(sys.argv)
# Data is clearly separated:
# 4: Never enumerate variables! Use lists!
stuff = QStringListModel(["Foo", "Bar", "Baz"])
# The graphical components is just how you interface with the data with the user!
win = StuffViewer(stuff)
win.show()
sys.exit(apk.exec_())
window()
推荐阅读
- python - 循环遍历来自 Django 的属性列表
- node.js - 我无法在浏览器(chrome 或 firefox)上设置仅 http cookie
- sql - 如何使用联接选择满足同一列的两个条件的记录?
- google-apps-script - Google Sheets Script -> 如何根据单元格触发器将行作为值复制到另一个选项卡中,然后清除触发器单元格?
- python - python 3中for循环索引和切片索引之间的连接
- java - 无法解析 org.web3j:core:5.0.0 的插件描述符
- r - ggsave 使用 ggarrange 创建的部分常见图例的剪辑
- javascript - 相当于可以在 POSTMAN 中使用的命令
- r - gganimate transition_event 与日期时间数据
- wordpress - htaccess:如果请求的 URL 不包含特定字符串,则将用户重定向到不同的域,同时保持 slug