Изменить имя вкладки из дочернего класса

1

Я пытаюсь изменить функцию текста, указанного на вкладке, но мне трудно понять, как правильно ссылаться на вкладку.

Нижеприведенный код работает, но ничего не делает, поскольку одна строка закомментирована. Я знаю, что проблема связана с "я" в этой строке (не комментирование строки вызывает ошибку при нажатии кнопки), но я не знаю, что должно быть там, чтобы заставить ее работать. Я предполагаю, что моя проблема связана с тем, что вкладка создается другим классом, но я хочу иметь возможность открывать несколько вкладок с одинаковыми виджетами в каждом из них (как это делает код). Должен ли я перестроить код, чтобы сделать эту работу?

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_())
Теги:
python-3.x
pyqt5
pyqt
qtabwidget

1 ответ

1
Лучший ответ

Вы хотите изменить текст и в своей попытке используете переменную 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_())

Ещё вопросы

Сообщество Overcoder
Наверх
Меню