2013-02-14 8 views
8

bir tabWidget ayrı bir pencereden dışarı pop. Sekme widget'ına ekleyebileceğim ve kaldırabileceğim QtGui.QWidget'dan genişletilmiş birkaç widget oluşturuyorum.nasıl Eklendiğim bir <code>QtGui.QTabWidget</code> ile uzun bir ana pencere Pyside Qt

Yapmak istediğim şey, çocuk widget'inin sekme widget'ından kaldırılmasına ve kendi bağımsız penceresinin (ve bir "pop-in" düğmesinin koyulmasına neden olan bir "pop-out" düğmesine sahip olmasıdır. ana pencereye geri döndü). Gtalk’ta Gtalk’ın aynı fikri vardır. Ben ana penceresini kapatırsanız, öteki "sekmeler" veya "pencereler" nın aynı zamanda yakın ve ben yan-yana tüm pencereleri koymak ve onları tüm görünür ve aynı zamanda güncellenmesi olması mümkün olması gerektiğini Not. (Yakın gerçek zamanlı veriyi görüntüleyeceğim).

Ben Qt için yeni ama yanılmıyorsam eğer bir Widget üst öğesi yoksa, bağımsız çıkageldi. Bu çalışır, ancak o zaman geri pencereyi "pop" nasıl hiçbir fikrim yok.

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

Yüreğim hala ikisi arasında bir ebeveyn/çocuk ilişkisi olması gerektiğini söylüyor.

veli tutmak için bir yolu var mı ama hala pencere bağımsız gelip var ya

Ben QT'ın tarzını yanlış anlama ben? Aksi takdirde, ana pencereye ( self.parentalUnit = self.parent() gibi) giden bir bağlantıyı tutmak için çocukta bir değişken oluşturarak iyi bir fikir mi yoksa bir hackish/kludgy fikri mi olur? Qt yılında

cevap

10

parent olarak bırakın olduğunu. parent'u kaldırırsanız, ana pencerenin kapatılması artık üst düzey pencereler olduğundan, 'kayan' sekmelerini kapatmaz. windowFlags, bir widget'ın pencere mi yoksa bir çocuk widget'ı mı olduğunu tanımlar. Temel olarak, Aşağıda küçük ama tam bir örnektir

QtCore.Qt.Window ila QtCore.Qt.Widget alternatif gerekir:

#!/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

Merhaba @Avaris, o _exactly_ istediğim, sadece zaman bunu bulmak için görünmüyor olduğu Dokümanlar aracılığıyla bakıyordu. Programın buraya nasıl aktığı daha nettir, bu yüzden harika örnek için teşekkürler! :) –

+1

@LauraWentworth: Bunun yardımcı olduğuna sevindim :). – Avaris

0

, düzen düzen eklenen widget üzerinde sahipliğini alır, bu yüzden ebeveynliğe halledeyim. Açma düğmesine bastığınızda ve bu tuşa basılıncaya kadar gizlenecek olan başka bir widget (ebeveynsiz) oluşturabilir, orijinal düzeninden "pop-widget" öğesini kaldırır ve gizli widget'in düzenine eklersiniz. Ve düğmeyi basılı tuttuğunuzda - widget'i orijinal düzenine döndürür. Ana pencereyi kapatırken Bu gizli pencereyi kapatmak için, siz (hepsi aynı i python, bahis C++ için üzgünüm ama) böyle bir şey için closeEvent(QCloseEvent* ev) yeniden tanımlamak gerekir:

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 
}