【发布时间】:2021-05-14 02:17:46
【问题描述】:
我在 PyQt5 中创建了一个搜索引擎,使用以下代码:
import sys
from PyQt5.QtWidgets import (
QWidget, QLineEdit, QLabel, QScrollArea, QMainWindow,
QApplication, QHBoxLayout, QVBoxLayout, QSpacerItem, QSizePolicy, QCompleter, QPushButton
)
from PyQt5 import QtCore
from PyQt5.QtCore import Qt
tlist = ['thing1', 'thing2', 'thing3', 'thing4']
class Label(QWidget):
def __init__(self, name):
super(Label, self).__init__()
self.name = name
self.lbl = QLabel(self.name)
self.lbl.setTextInteractionFlags(QtCore.Qt.TextSelectableByMouse)
self.btn = QPushButton("Preview")
self.btn.setMaximumSize(QtCore.QSize(100,100))
self.btn.clicked.connect(self.printsignal)
self.hbox = QHBoxLayout()
self.hbox.addWidget(self.lbl)
self.hbox.addWidget(self.btn)
self.setLayout(self.hbox)
def show(self):
for labels in [self, self.lbl]:
labels.setVisible(True)
def hide(self):
for labels in [self, self.lbl]:
labels.setVisible(False)
def printsignal(self):
print("clicked")
class MainWindow(QMainWindow):
def __init__(self, *args, **kwargs):
super().__init__()
self.controls = QWidget()
self.controlsLayout = QVBoxLayout()
self.widgets = []
for name in tlist:
item = Label(name)
self.controlsLayout.addWidget(item)
self.widgets.append(item)
spacer = QSpacerItem(1, 1, QSizePolicy.Minimum, QSizePolicy.Expanding)
self.controlsLayout.addItem(spacer)
self.controls.setLayout(self.controlsLayout)
self.scroll = QScrollArea()
self.scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
self.scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.scroll.setWidgetResizable(True)
self.scroll.setWidget(self.controls)
self.searchbar = QLineEdit()
self.searchbar.textChanged.connect(self.update_display)
self.completer = QCompleter(tlist)
self.completer.setCaseSensitivity(Qt.CaseInsensitive)
self.searchbar.setCompleter(self.completer)
container = QWidget()
containerLayout = QVBoxLayout()
containerLayout.addWidget(self.searchbar)
containerLayout.addWidget(self.scroll)
container.setLayout(containerLayout)
self.setCentralWidget(container)
self.setGeometry(600, 100, 800, 600)
self.setWindowTitle('Search Engine')
def update_display(self, text):
for widget in self.widgets:
if text.lower() in widget.name.lower():
widget.show()
else:
widget.hide()
app = QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
我遇到的问题是,所有按钮共享相同的功能,我不知道如何使它们具有不同的信号,因为它们是自动生成的。基本上,如果我运行代码,它会显示为
this:
当我按下任何按钮时,它将打印“点击”(如在 printsignal 函数中)。我想要的是每个按钮的不同功能。有没有办法做到这一点?
【问题讨论】:
-
1) 应该发生什么而不是打印消息? 2)
show和hide的覆盖没有用,删除它们,因为 QWidget 已经提供了它。 -
1) 每个按钮都应该打印他们的名字(ei:如果我按下thing1旁边的按钮,它应该打印“clicked thing1”,如果我按下thing2旁边的按钮,它应该打印“clicked事物2”等等)。 2)我不知道,但它有效,所以谢谢你
-
由于您可以从
Label.printsignal中访问self.lbl,因此您可以使用print(f"clicked {self.lbl.text()}")之类的内容。 -
是的!这样可行!谢谢!
-
昨天有类似的问题 - 在函数中,您可以使用
self.sender().text()从产生信号的Button获取text。但是,如果您创建自己的小部件Label,那么您可以直接在您的小部件Label中获取值,并且每个小部件都会获得自己的值。
标签: python button pyqt pyqt5 signals