Изменить имя вкладки из дочернего класса - PullRequest
0 голосов
/ 21 сентября 2018

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

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

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

1 Ответ

0 голосов
/ 21 сентября 2018

Вы хотите изменить текст, и при попытке вы используете переменную tabName, но эта переменная принимает начальное значение QLineEdit, и после того, как вы его не обновляете, как вы хотите изменить текст?

Одним из решений является создание сигнала, который переносит новый заголовок, который должен быть обновлен и должен генерироваться в тот момент, когда щелкает сигнал щелчка.

Затем установить новыйname, вы должны использовать метод 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_())
...