【问题标题】:How to switch between tabs via pushbutton ? using pyqt如何通过按钮在选项卡之间切换?使用 pyqt
【发布时间】:2020-11-24 09:33:34
【问题描述】:

我是新手,也许这是个愚蠢的问题。 我想通过单击 pushButton 来激活选项卡。如果我单击 pushButton_1,那么它会显示/激活 tab_1,在单击 pushButton_2 时会切换到 tab_2,依此类推。下面是我如何尝试但没有成功的图片。帮我解决这个问题并写下正确的代码。提前谢谢你。

这是我的代码:

from spex import *
import sys



class speX (Ui_MainWindow):
    def __init__(self, window):
        self.setupUi(window)
        self.systemButton.clicked.setCurrentIndex(self, 0)
        self.cpuButton.clicked.setCurrentIndex(self, 1)



app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()

ui = speX (MainWindow)
MainWindow.show()
app.exec_()

我想要这个 - 当我单击 systemButton 时,激活索引为 0 的选项卡,当单击 cpuButton 时激活索引为 1 的选项卡。

那里提供的错误 -

Traceback (most recent call last):
  File "d:\spex\main.py", line 17, in <module>
    ui = speX (MainWindow)
  File "d:\spex\main.py", line 9, in __init__
    self.systemButton.clicked.setCurrentIndex(self, 0)
AttributeError: 'PyQt5.QtCore.pyqtBoundSignal' object has no attribute 'setCurrentIndex'

这是我的项目示例 - pyuic5 ui to py code

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'D:/spex/example.ui'
#
# Created by: PyQt5 UI code generator 5.13.2
#
# WARNING! All changes made in this file will be lost!


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(763, 611)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.stackedWidget = QtWidgets.QStackedWidget(self.centralwidget)
        self.stackedWidget.setGeometry(QtCore.QRect(270, 70, 361, 361))
        self.stackedWidget.setObjectName("stackedWidget")
        self.page = QtWidgets.QWidget()
        self.page.setObjectName("page")
        self.buttonBox = QtWidgets.QDialogButtonBox(self.page)
        self.buttonBox.setGeometry(QtCore.QRect(50, 310, 193, 28))
        self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok)
        self.buttonBox.setObjectName("buttonBox")
        self.stackedWidget.addWidget(self.page)
        self.page_2 = QtWidgets.QWidget()
        self.page_2.setObjectName("page_2")
        self.commandLinkButton = QtWidgets.QCommandLinkButton(self.page_2)
        self.commandLinkButton.setGeometry(QtCore.QRect(70, 190, 222, 48))
        self.commandLinkButton.setObjectName("commandLinkButton")
        self.stackedWidget.addWidget(self.page_2)
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(50, 110, 93, 28))
        self.pushButton.setObjectName("pushButton")
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setGeometry(QtCore.QRect(50, 190, 93, 28))
        self.pushButton_2.setObjectName("pushButton_2")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 763, 26))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        self.stackedWidget.setCurrentIndex(0)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.commandLinkButton.setText(_translate("MainWindow", "CommandLinkButton"))
        self.pushButton.setText(_translate("MainWindow", "PushButton"))
        self.pushButton_2.setText(_translate("MainWindow", "PushButton"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

【问题讨论】:

  • 请在您的问题中以文本形式分享您的代码,而不是使用图像。阅读有关formatting code 的更多信息。另外,请提供一个minimal, reproducible example 来说明您目前所拥有的内容(即使它不起作用),确保它包含尽可能多的内容(但不要太多,它必须可重现,但仍然最小)。
  • 现在可以查了吗?
  • @RomanSmith 我们需要从 pyuic 生成的代码,虽然我们可能已经知道您的代码有什么问题,但我们不能盲目地帮助您。也提供使用 pyuic 创建的文件。
  • @RomanSmith 在提供的用户界面中没有systemButton 和cpuButton 的踪迹。
  • 我强烈建议您对您提供的代码更加小心。当我们要求您提供一个最小的可重现示例时,这意味着我们必须能够通过最少的(或者最好不要)编辑来复制、粘贴和运行您的代码。如果您不帮助我们,我们将无法帮助您,并且您不能期望我们“修补”您的代码中所有丢失或放错位置的部分。如果人们没有看到这种努力,他们很容易生气,而您最终可能会失去解决问题的机会。

标签: python-3.x pyqt pyqt5 qt5


【解决方案1】:

在 Qt 中,当特定事件发生时会发出 信号:单击按钮、更改某些文本等。

然后将信号连接到 slots,这些功能可以以某种方式对这些信号做出反应。例如,您可以创建一个 slot 来更改标签中的文本,并将其连接到按钮的clicked 信号:然后,当您单击该按钮时,文本会更改。

为什么您的代码不起作用?
好吧,比如setCurrentIndex 是一个 QStackedWidget 的方法(类似于 QTabWidget),所以下面的内容没有多大意义:

    self.systemButton.clicked.setCurrentIndex(self, 0)

对堆叠小部件的引用在哪里?

在 PyQt 中,您可以像这样连接信号和插槽:

    someObject.signal.connect(someFunction)

注意someFunction 是对该函数的引用;以下将不工作:

    someObject.signal.connect(someFunction())

如果您想在单击按钮后更改堆叠小部件的索引,则必须创建一个更改该索引的函数,并将其连接到单击信号。

class speX (Ui_MainWindow):
    def __init__(self, window):
        self.setupUi(window)
        self.pushButton.clicked.connect(self.goToSecondPage)

    def goToSecondPage(self):
        self.stackedWidget.setCurrentIndex(1)

我强烈建议您仔细研究python classes 的工作原理,以及一般而言的面向对象编程范式。

【讨论】:

  • 感谢您的帮助和提示,我会考虑全部。
【解决方案2】:

最简单的解决方案是将您的按钮连接到一个在点击时更改标签索引的函数

tabs = QtWidget.QTabWidget()
tab1 = QtWidget.QWidget()
tabs.addTab(self.tab1, "Tab 1")

systemButton.clicked.connect(tabIndex0)

def tabIndex0():
    tabs.setCurrentIndex(0)

【讨论】:

  • 感谢您的帮助。我试图做这样的事情。这也帮助了我。再次感谢您。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-26
  • 2016-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多