2013-02-14 9 views
8

Mam rozszerzone główne okno z dodanym QtGui.QTabWidget. Tworzę kilka widgetów rozszerzonych z QtGui.QWidget, które mogę dodać i usunąć do widgetu karty.Jak wyskoczyć osobne okno z zakładki Widget w PySide Qt

Co mam zrobić, to przycisk "pop-out", który powoduje, że widget podrzędny zostanie usunięty z widgetu tabulatora i pojawi się jako własne niezależne okno (oraz przycisk "pop-in" do wstawienia z powrotem do głównego okna). Ten sam pomysł, co Gtalk-in-Gmail. Pamiętaj, że jeśli zamknę główne okno, pozostałe "zakładki" lub "okna" również powinny się zamknąć, a ja powinienem móc umieścić wszystkie okna obok siebie i mieć je wszystkie widoczne i aktualizowane w tym samym czasie. (Będę wyświetlał dane zbliżone do rzeczywistych).

Jestem nowy w Qt, ale jeśli się nie mylę, jeśli widżet nie ma rodzica, pojawia się niezależnie. To działa, ale ja wtedy nie mają pojęcia, jak mogę „pop” okno widok.

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

Mój gut mówi, że nie powinno być nadal relacja rodzic/dziecko między nimi.

Czy istnieje sposób na utrzymanie rodzica, ale nadal okno może pojawić się niezależnie, czy nie rozumiem stylu Qt?

Inaczej, czy tworzenie zmiennej w potomku, która ma zawierać link do głównego okna (np. self.parentalUnit = self.parent()), jest dobrym pomysłem lub pomysłem hackish/kludgy?

Odpowiedz

10

Pozostawić parent jako jest. Jeśli usuniesz parent, zamknięcie okna głównego nie zamknie kart "pływających", ponieważ są one teraz oknami najwyższego poziomu. windowFlags określa, czy widget jest oknem, czy widżetem podrzędnym. Zasadniczo trzeba przełączać między QtCore.Qt.Window i QtCore.Qt.Widget

Poniżej jest mały, ale kompletny przykład:

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

Hi @Avaris, czyli _exactly_ co chciałem, po prostu nie może wydawać się go znaleźć, kiedy przeglądałem dokumenty. Jest także o wiele jaśniejszy, jak program płynie tutaj, dzięki za wspaniały przykład! :) –

+1

@LauraWentworth: Cieszę się, że to pomaga :). – Avaris

0

W Qt układ przejmuje własność nad widżetami dodanymi do układu, więc pozwól mu obsłużyć rodzicielstwo. Możesz utworzyć kolejny widget (bez rodzica), który będzie ukryty do momentu naciśnięcia przycisku wyskakującego, a po jego naciśnięciu usuniesz "widget pop-out" z oryginalnego układu i dodaj go do układu ukrytego widżetu. Po naciśnięciu przycisku pop-in - przywróć widżet do jego oryginalnego układu. Aby zamknąć ten ukryty okna podczas zamykania okna głównego, trzeba przedefiniować closeEvent(QCloseEvent* ev) do czegoś takiego (przepraszam za C++, ale założę się, w Pythonie to wszystko to samo):

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 
} 
Powiązane problemy