python - 编辑子类中的选项卡名称

标签 python python-3.x pyqt pyqt5 qtabwidget

我正在尝试使用函数更改选项卡上列出的文本,但我无法弄清楚如何正确引用该选项卡。

下面的代码可以工作,但由于一行被注释掉所以什么也不做。我知道问题出在该行中的“self”(取消注释该行会在单击按钮时导致错误),但我不知道应该做什么才能使其工作。我猜测我的问题是由不同的类创建的选项卡,但我希望能够打开多个选项卡,每个选项卡中都包含相同的小部件(如此代码所示)。我是否需要重构代码才能使其正常工作?

from PyQt5.QtWidgets import (QMainWindow, QApplication, QAction, qApp,
    QPushButton, QWidget, QMenu, QVBoxLayout, QTabWidget, QLineEdit,
    QLabel, QHBoxLayout)
import sys

class MainWin(QMainWindow):

    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):

        exitAct = QAction('&Exit', self)
        exitAct.triggered.connect(qApp.quit)

        newAct = QAction('&New Tab', self)
        newAct.triggered.connect(self.newTab)

        menubar = self.menuBar()
        fileMenu = menubar.addMenu('&File')

        fileMenu.addAction(newAct)
        fileMenu.addAction(exitAct)

        self.layout = QVBoxLayout()

        self.tabbed = QTabWidget(self)
        self.layout.addWidget(self.tabbed)
        self.setCentralWidget(self.tabbed)

        self.show()

    def newTab(self):
        self.tab1 = tabbedFrame(self.tabbed)
        self.tabbed.addTab(self.tab1, self.tab1.tabName)


class tabbedFrame(QWidget):
    def __init__(self, parent):
        super(tabbedFrame, self).__init__(parent)
        layout = QVBoxLayout()
        self.updateButton = QPushButton("Update")
        self.updateButton.clicked.connect(self.updateTab)
        layout.addWidget(QLabel("Tab Name"))
        self.nameLineEdit = QLineEdit("New Tab")
        self.tabName = self.nameLineEdit.text()
        layout.addWidget(self.nameLineEdit)
        layout.addWidget(self.updateButton)
        self.setLayout(layout)

    def updateTab(self):
        tabindex = win.tabbed.currentIndex
        #win.tabbed.setTabText(self, tabindex, self.tabName)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = MainWin()
    sys.exit(app.exec_())

最佳答案

您想要更改文本,并且在尝试中使用变量 tabName,但该变量采用 QLineEdit 的初始值,并且在您不更新它之后,您如何想要更改文本吗?

一种解决方案是创建一个信号来传输必须更新的新标题,并且必须在通过单击的信号单击时发出。

然后,要建立新名称,您必须使用 setTabText() 方法,您必须在其中传递选项卡的索引和新名称。为此,我们可以在连接中使用 functools.partial():

import sys
from functools import partial
from PyQt5 import QtCore, QtWidgets


class MainWin(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        exitAct = QtWidgets.QAction('&Exit', self)
        exitAct.triggered.connect(QtWidgets.qApp.quit)
        newAct = QtWidgets.QAction('&New Tab', self)
        newAct.triggered.connect(self.newTab)
        menubar = self.menuBar()
        fileMenu = menubar.addMenu('&File')

        fileMenu.addAction(newAct)
        fileMenu.addAction(exitAct)
        self.tabbed = QtWidgets.QTabWidget()
        self.setCentralWidget(self.tabbed)

        self.show()

    def newTab(self):
        tab = TabbedFrame()
        ix = self.tabbed.addTab(tab, "")
        tab.nameTabChanged.connect(partial(self.tabbed.setTabText, ix))
        tab.updateTab()


class TabbedFrame(QtWidgets.QWidget):
    nameTabChanged = QtCore.pyqtSignal(str)

    def __init__(self, parent=None):
        super(TabbedFrame, self).__init__(parent)

        updateButton = QtWidgets.QPushButton("Update")
        updateButton.clicked.connect(self.updateTab)
        self.nameLineEdit = QtWidgets.QLineEdit("New Tab")

        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(QtWidgets.QLabel("Tab Name"))
        layout.addWidget(self.nameLineEdit)
        layout.addWidget(updateButton)
        layout.addStretch()

    def updateTab(self):
        new_name = self.nameLineEdit.text()
        self.nameTabChanged.emit(new_name)


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    win = MainWin()
    sys.exit(app.exec_())

关于python - 编辑子类中的选项卡名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52447494/

相关文章:

python - 仅当它们具有匹配值时,如何添加作为列表的键值?

python - wxpython:如何在flexgridsizer中保持三个wxTextCtrl具有相同的大小

python - 如何在纯 python 或 : How to bind the key left of the [1] to a shortcut in Qt 中从硬件键号/扫描码获取实际键名

python - 如何测试 X 是否像列表/元组一样嘎嘎作响

python - 提取字符、字符串或括号之间的文本

python - python中猜测数字

python - 无法在 Docker 上运行 Flask (ModuleNotFoundError)

python-3.x - Python 错误消息 io.UnsupportedOperation : not readable

python - PyQt:如何在不卡住 GUI 的情况下更新进度?

python - PyQt:导入 .xls 文件并填充 QTableWidget?