2017-03-17 28 views
0

QSplitterを使用して、MainWindowを両側で分割したいと考えています。左側にはフォルダビューを含むレイアウトがあり、右側にはいくつかのことをプロットするレイアウトがあります。しかし、私はQSplitterにウィジェットしか追加できません。また、レイアウトはウィジェットではありません。 私が見つけた唯一の同様の質問は、これらのだった:PyQt - レイアウトをQSplitterに追加

http://www.qtcentre.org/threads/16856-QSplitter-multiple-layouts-how https://forum.qt.io/topic/8197/solved-qsplitter-and-qvboxlayout-problem

ので、上記のリンクによると、私の計画は、その後、2つのレイアウトを作成し、その後2 QWidgets(setLayoutのを使用)、それらを追加することですこれらのQWidgetsをQSplitterに追加します(addWidgetを使用)。 私はそれを私のコードに適用しようとしましたが、残念ながらレイアウトをウィジェットに追加すると何も表示されません!

私が欲しいものを達成する別の方法はありますか? 私は答えを誤解しましたか?

ここにコードがあります。コードをよりシンプルにするために、フォルダビューレイアウトのみを送信します。 また、pyqtとオブジェクト指向プログラミングについては全く新しいので、どのように改善するかについての賞賛は大歓迎です!

ありがとうございます!

import sys 
from PyQt5.QtWidgets import * 
from PyQt5.QtGui import * 
from PyQt5.QtCore import * 

class Window(QMainWindow): 

    def __init__(self, parent=None): 

     super(Window, self).__init__(parent) 
     self.UI() 

    def UI(self): 

     self.central_widget = QStackedWidget() 
     self.setCentralWidget(self.central_widget) 

     self.statusBar().showMessage("Ready") 

     page1 = FirstWidget(self) 
     page1.visualize_btn.clicked.connect(self.P_2) 
     self.central_widget.addWidget(page1)   

     self.setGeometry(10, 10, 800, 500) #All three methods have been inherited from the QWidget class. 
     self.showMaximized() 
     self.setWindowTitle('PTV') 
     self.setWindowIcon(QIcon('tuc_logo.png')) 

    def P_2(self): 

     page2 = VisualizeWidget(self) 
     self.central_widget.addWidget(page2) 
     self.central_widget.setCurrentWidget(page2) 


class FirstWidget(QWidget): 

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

    def buttons(self): 

     self.btn2 = QPushButton("Visualize") 
     self.buttonsLayout = QVBoxLayout() 
     self.buttonsLayout.addWidget(self.btn2) 
     self.visualize_btn = self.btn2   
     self.setLayout(self.buttonsLayout) 


class VisualizeWidget(QWidget): 

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


     self.dirmodel = QFileSystemModel()   
     self.dirmodel.setFilter(QDir.NoDotAndDotDot | QDir.AllDirs) # Don't show files, just folders 

     self.folder_view = QTreeView(parent=self); 
     self.folder_view.setModel(self.dirmodel) 
     self.folder_view.clicked[QModelIndex].connect(self.clicked) 

     self.now_layout = QVBoxLayout() 
     self.now_layout.addWidget(self.folder_view) 

     #self.setLayout(self.now_layout) 

     #HERE is where I'm trying to add the layout to the widget. 
     self.left_widget = QWidget() 
     self.left_widget.setLayout(self.now_layout)    


    def set_path(self): 
     self.dirmodel.setRootPath("") 

    def clicked(self, index): 
     index = self.selectionModel.currentIndex() 
     dir_path = self.dirmodel.filePath(index) 

     self.filemodel.setRootPath(dir_path) 
     self.file_view.setRootIndex(self.filemodel.index(dir_path))   

def main(): 
    app = QApplication(sys.argv) 
    win = Window() 
    win.show() 
    app.exec_() 

if __name__ == '__main__': 
    sys.exit(main()) 

答えて

0

私は実際に私が間違って何をやっていた、まだ理解していないが、私は場合には、それは将来的に他の誰かを助け、作業コードを掲示しています。

ここでは、2つのレイアウトがQSplitterで分割されています。

import sys 
from PyQt5.QtWidgets import * 
from PyQt5.QtGui import * 
from PyQt5.QtCore import * 

class Window(QMainWindow): 

    def __init__(self, parent=None): 

     super(Window, self).__init__(parent) 
     self.UI() 

    def UI(self): 

     self.central_widget = QStackedWidget() 
     self.setCentralWidget(self.central_widget) 

     self.statusBar().showMessage("Ready") 

     page1 = FirstWidget(self) 
     page1.visualize_btn.clicked.connect(self.P_2) 
     self.central_widget.addWidget(page1)   

     self.setGeometry(10, 10, 800, 500) #All three methods have been inherited from the QWidget class. 
     self.showMaximized() 
     self.setWindowTitle('PTV') 
     self.setWindowIcon(QIcon('tuc_logo.png')) 

    def P_2(self): 

     page2 = VisualizeWidget(self) 
     self.central_widget.addWidget(page2) 
     self.central_widget.setCurrentWidget(page2) 


class FirstWidget(QWidget): 

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

    def buttons(self): 

     self.btn2 = QPushButton("Visualize") 
     self.buttonsLayout = QVBoxLayout() 
     self.buttonsLayout.addWidget(self.btn2) 
     self.visualize_btn = self.btn2   
     self.setLayout(self.buttonsLayout) 


class VisualizeWidget(QWidget): 

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


     #Creation of the left layout 
     self.dirmodel = QFileSystemModel()   
     self.dirmodel.setFilter(QDir.NoDotAndDotDot | QDir.AllDirs) # Don't show files, just folders 

     self.folder_view = QTreeView(parent=self); 
     self.folder_view.setModel(self.dirmodel) 
     self.folder_view.clicked[QModelIndex].connect(self.clicked) 

     self.selectionModel = self.folder_view.selectionModel() 

     self.now_layout = QVBoxLayout() 
     self.now_layout.addWidget(self.folder_view) 


     self.left_widget = QWidget() 
     self.left_widget.setLayout(self.now_layout) 


     #Creation of the right layout 
     #self.right_widget = QTextEdit(); 

     self.btn1 = QPushButton('btn1') 

     self.right_layout = QVBoxLayout() 
     self.right_layout.addWidget(self.btn1) 

     self.right_widget = QWidget() 
     self.right_widget.setLayout(self.right_layout) 




     splitter_filebrowser = QSplitter(Qt.Horizontal) 
     splitter_filebrowser.addWidget(self.left_widget) 
     splitter_filebrowser.addWidget(self.right_widget) 
     splitter_filebrowser.setStretchFactor(1, 1) 

     hbox = QHBoxLayout(self) 
     hbox.addWidget(splitter_filebrowser) 

     self.setLayout(hbox) 



    def set_path(self): 
     self.dirmodel.setRootPath("") 

    def clicked(self, index): 
     index = self.selectionModel.currentIndex() 
     dir_path = self.dirmodel.filePath(index) 

     self.filemodel.setRootPath(dir_path) 
     self.file_view.setRootIndex(self.filemodel.index(dir_path))   

def main(): 
    app = QApplication(sys.argv) 
    win = Window() 
    win.show() 
    app.exec_() 

if __name__ == '__main__': 
    sys.exit(main()) 
関連する問題