2013-02-14 20 views
8

拡張メインウィンドウにQtGui.QTabWidgetが追加されています。私はQtGui.QWidgetから拡張されたいくつかのウィジェットを作成しており、これをタブウィジェットに追加して削除することができます。PySide QtのtabWidgetから別のウィンドウを開く方法

私がしたいのは、子ウィジェットがタブウィジェットから削除され、独立したウィンドウとして表示される「ポップアウト」ボタンがあることです(および「ポップイン」ボタンメインウィンドウに戻ります)。 Gtalk-in-Gmailと同じ考えです。 メインウィンドウを閉じると、他の「タブ」や「ウィンドウ」も閉じて、すべてのウィンドウを並べて表示し、同時にすべてを表示して更新できるようにする必要があります。 (私はほぼリアルタイムのデータを表示します)。

私はQtの新人ですが、私が間違っていない場合、ウィジェットに親がない場合、それは独立して現れます。これは動作しますが、私はその後、私は後ろにウィンドウを「ポップ」できるか見当がつかない。

class TCWindow(QtGui.QMainWindow): 
    . 
    . 
    . 
    def popOutWidget(self, child): 
     i = self.tabHolder.indexOf(child) 
     if not i == -1: 
      self.tabCloseRequested(i) 
     self.widgets[i].setParent(None) 
     self.widgets[i].show() 

私の腸はまだ2間の親/子関係がなければならないと述べています。

親を維持する方法はありますか?まだウィンドウが独立しているか、Qtのスタイルを誤解していますか?

そうでなければ、子供の中に(self.parentalUnit = self.parent()のような)メインウィンドウへのリンクを保持するための変数が良いアイデアかハックキックかクラージーなアイデアですか?

答えて

10

はとしてparentを残しますです。 parentを削除すると、メインウィンドウを閉じても 'トップ'ウィンドウになっているため、 'フローティング'タブは閉じられません。 windowFlagsは、ウィジェットがウィンドウウィジェットか子ウィジェットかを定義します。基本的に、あなたは以下QtCore.Qt.WindowQtCore.Qt.Widget

の間で交互にする必要があり、小さいながらも完全な例です:

#!/usr/bin/env python 
# -.- coding: utf-8 -.- 
import sys 
from PySide import QtGui, QtCore 


class Tab(QtGui.QWidget): 
    popOut = QtCore.Signal(QtGui.QWidget) 
    popIn = QtCore.Signal(QtGui.QWidget) 

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

     popOutButton = QtGui.QPushButton('Pop Out') 
     popOutButton.clicked.connect(lambda: self.popOut.emit(self)) 
     popInButton = QtGui.QPushButton('Pop In') 
     popInButton.clicked.connect(lambda: self.popIn.emit(self)) 

     layout = QtGui.QHBoxLayout(self) 
     layout.addWidget(popOutButton) 
     layout.addWidget(popInButton) 


class Window(QtGui.QWidget): 
    def __init__(self, parent=None): 
     super(Window, self).__init__() 

     self.button = QtGui.QPushButton('Add Tab') 
     self.button.clicked.connect(self.createTab) 
     self._count = 0 
     self.tab = QtGui.QTabWidget() 
     layout = QtGui.QVBoxLayout(self) 
     layout.addWidget(self.button) 
     layout.addWidget(self.tab) 

    def createTab(self): 
     tab = Tab() 
     tab.setWindowTitle('%d' % self._count) 
     tab.popIn.connect(self.addTab) 
     tab.popOut.connect(self.removeTab) 
     self.tab.addTab(tab, '%d' % self._count) 
     self._count += 1 

    def addTab(self, widget): 
     if self.tab.indexOf(widget) == -1: 
      widget.setWindowFlags(QtCore.Qt.Widget) 
      self.tab.addTab(widget, widget.windowTitle()) 

    def removeTab(self, widget): 
     index = self.tab.indexOf(widget) 
     if index != -1: 
      self.tab.removeTab(index) 
      widget.setWindowFlags(QtCore.Qt.Window) 
      widget.show() 


if __name__ == '__main__': 
    app = QtGui.QApplication(sys.argv) 

    w = Window() 
    w.show() 

    sys.exit(app.exec_()) 
+1

こんにちは@Avaris、それは私が望ん_exactly_ですが、私はちょうどその時、私にそれを見つけるように見えることができませんでしたドキュメントを見ていた。プログラムの流れがはっきりしていますので、素晴らしい例に感謝します! :) –

+1

@LauraWentworth:私はそれが助けて嬉しいです:)。 – Avaris

0

Qtでは、layoutはレイアウトに追加されたウィジェットよりもオーナーシップがあるので、それは親の関係を処理します。 ポップアウトボタンを押すまで非表示になる別のウィジェット(親なし)を作成することができます。それを押すと、元のレイアウトから「ポップアウトウィジェット」が削除され、隠しウィジェットのレイアウトに追加されます。ポップインボタンが押されたとき - ウィジェットを元のレイアウトに戻します。 メインウィンドウを閉じるとき、(Pythonで、それはすべて同じですが、Cの++のため申し訳ありませんが、私は賭け)あなたはこのような何かにcloseEvent(QCloseEvent* ev)を再定義する必要がありますが、この隠されたウィンドウを閉じるには:

void MainWindow::closeEvent(QCloseEvent* ev) 
{ 
    dw->setVisible(false); // independent of mainwindow widget 
    sw->setVisible(false); // independent of mainwindow widget 
    QWidget::closeEvent(ev); //invoking close event after all the other windows are hidden 
} 
関連する問題