タブにリストされているテキストを関数に変更させようとしていますが、タブを適切に参照する方法がわかりません。
以下のコードは機能しますが、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_())
テキストを変更したいのですが、変数tabNameを使用していますが、その変数はの初期値を取りQLineEdit
ます。更新しない場合は、テキストをどのように変更しますか?
1つの解決策は、更新する必要があり、クリックされた信号を介してクリックされた瞬間に放出される必要がある新しいタイトルを転送する信号を作成することです。
次に、新しい名前を確立するに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_())
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加