簡體   English   中英

如何在PyQt4中連接QTreeWidget和QStackedWidget?

[英]How to connect QTreeWidget and QStackedWidget in PyQt4?

對不起,我只是Python的初學者。 我只想通過單擊QTreeWidget來更改QStackedWidget的索引。 我在網上搜索了SIGNAL和SLOT的教程,但無法解決問題。 QTreeWidget信號和QStackedWidget插槽中的參數不適合。

self.connect(qtree, QtCore.SIGNAL("itemClicked(QTreeWidgetItem*,int)"), stack, QtCore.SLOT("setCurrentIndex(int)"))

我嘗試了這個:

qtree.itemClicked.connect(stack.setCurrentIndex)

它只是顯示錯誤:

TypeError: setCurrentIndex(self, int): argument 1 has unexpected type 'QTreeWidgetItem'

我認為可能有一種方法,但是在網絡上找不到。

像這樣:

 from PyQt4.QtGui import *
 from PyQt4.QtCore import *
 import sys

 class StockDialog(QDialog):
     def __init__(self,parent=None):
         super(StockDialog,self).__init__(parent)

         mainSplitter=QSplitter(Qt.Horizontal)

         treewidget = QTreeWidget(mainSplitter)
         treewidget.setHeaderLabels(["Tree"])
         treeroot = QTreeWidgetItem(treewidget, ["Stack"])
         treeitem1 = QTreeWidgetItem(["WorkSpace"])
         treeitem2 = QTreeWidgetItem(["About"])
         treeroot.addChild(treeitem1)
         treeroot.addChild(treeitem2)

         stack=QStackedWidget(mainSplitter)
         stack.setFrameStyle(QFrame.Panel|QFrame.Raised)

         stackworkspace=StackWorkSpace()
         stackabout=StackAbout()
         stack.addWidget(stackworkspace)
         stack.addWidget(stackabout)

         closePushButton=QPushButton(self.tr("Close"))

         self.connect(treewidget,
            SIGNAL("itemClicked(int)"),
            stack,SLOT("setCurrentIndex(int)"))
         self.connect(closePushButton,
            SIGNAL("clicked()"),
            self,SLOT("close()"))

         layout=QVBoxLayout(self)
         layout.addWidget(mainSplitter)
         layout.addWidget(closePushButton)
         self.setLayout(layout)

 class StackWorkSpace(QWidget):
     def __init__(self,parent=None):
         super(StackWorkSpace,self).__init__(parent)
         widget1=QTextEdit(self.tr("WorkSpace"))
         widget2=QTextEdit(self.tr("WorkSpace"))

         layout=QGridLayout(self)
         layout.addWidget(widget1,0,0)
         layout.addWidget(widget2,0,1)

 class StackAbout(QDialog):
     def __init__(self,parent=None):
         super(StackAbout,self).__init__(parent)
         self.setStyleSheet("background: red")

 app=QApplication(sys.argv)
 main=StockDialog()
 main.show()
 app.exec_()

將QTreeWidget更改為StockDialog類中的QListWidget時,它可以工作。

class StockDialog(QDialog):
     def __init__(self,parent=None):
         super(StockDialog,self).__init__(parent)

         mainSplitter=QSplitter(Qt.Horizontal)

         listwidget=QListWidget(mainSplitter)
         listwidget.insertItem(0,self.tr("WorkSpace"))
         listwidget.insertItem(1,self.tr("About"))

         stack=QStackedWidget(mainSplitter)
         stack.setFrameStyle(QFrame.Panel|QFrame.Raised)

         stackworkspace=StackWorkSpace()
         stackabout=StackAbout()
         stack.addWidget(stackworkspace)
         stack.addWidget(stackabout)

         closePushButton=QPushButton(self.tr("Close"))

         self.connect(listwidget,
            SIGNAL("currentRowChanged(int)"),
            stack,SLOT("setCurrentIndex(int)"))
         self.connect(closePushButton,
            SIGNAL("clicked()"),
            self,SLOT("close()"))

         layout=QVBoxLayout(self)
         layout.addWidget(mainSplitter)
         layout.addWidget(closePushButton)
         self.setLayout(layout)

現在,我想用QTreeWidget做到這一點,怎么辦?

解決此問題的策略是將與每個窗口小部件關聯的索引信息保存在QTreeWidgetItem QTreeWidgetItem具有setData()方法,該方法允許我們將信息保存在項目中,在這種情況下,我們將保存索引。 每次通過addWidget()將小部件添加到QStackedWidgetaddWidget()返回該索引,因此總而言之,我們將執行以下操作:

treeitem1.setData(0, Qt.UserRole, stack.addWidget(stackworkspace))
treeitem2.setData(0, Qt.UserRole, stack.addWidget(stackabout))

連接QTreeWidgetitemClicked信號后,它返回列和按下的項目,並根據此信息獲取QStackedWidget索引,以恢復通過函數data()保存的data()

treewidget.itemClicked.connect(lambda item, column: stack.setCurrentIndex(item.data(column, Qt.UserRole))
if item.data(column, Qt.UserRole) is not None else None)

必要的代碼可以在以下部分中找到:

class StockDialog(QDialog):
    def __init__(self, parent=None):
        super(StockDialog, self).__init__(parent)

        mainSplitter = QSplitter(Qt.Horizontal)

        treewidget = QTreeWidget(mainSplitter)
        treewidget.setHeaderLabels(["Tree"])
        treeroot = QTreeWidgetItem(treewidget, ["Stack"])
        treeitem1 = QTreeWidgetItem(["WorkSpace"])
        treeitem2 = QTreeWidgetItem(["About"])
        treeroot.addChild(treeitem1)
        treeroot.addChild(treeitem2)

        stack = QStackedWidget(mainSplitter)
        stack.setFrameStyle(QFrame.Panel | QFrame.Raised)

        stackworkspace = StackWorkSpace()
        stackabout = StackAbout()

        treeitem1.setData(0, Qt.UserRole, stack.addWidget(stackworkspace))
        treeitem2.setData(0, Qt.UserRole, stack.addWidget(stackabout))

        closePushButton = QPushButton(self.tr("Close"))

        treewidget.itemClicked.connect(lambda item, column: stack.setCurrentIndex(item.data(column, Qt.UserRole))
        if item.data(column, Qt.UserRole) is not None else None)

        layout = QVBoxLayout(self)
        layout.addWidget(mainSplitter)
        layout.addWidget(closePushButton)
        self.setLayout(layout)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM