【问题标题】:How can I generate the buttons and connect them to different functions? [duplicate]如何生成按钮并将它们连接到不同的功能? [复制]
【发布时间】: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) showhide 的覆盖没有用,删除它们,因为 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


【解决方案1】:

通常您可以使用self.sender().text() 从产生信号的QButton 获取文本。

但是因为您使用QButtonQLabel 创建了自己的小部件Label,并且您想要标签中的文本,因此您可以直接获取self.name

def printsignal(self):
    print("clicked", self.name)

最终self.lbl.text()

def printsignal(self):
    print("clicked", self.lbl.text())

工作代码。

我删除了show()hide(),因为你不需要它

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().__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 printsignal(self):
        print("clicked", self.name)


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_())

【讨论】:

    猜你喜欢
    • 2023-03-30
    • 2019-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    相关资源
    最近更新 更多