2013-02-14 6 views
8

में मेरे पास एक विस्तृत मुख्य विंडो है जिसमें QtGui.QTabWidget जोड़ा गया है। मैं QtGui.QWidget से विस्तारित कई विजेट बना रहा हूं जिसे मैं टैब विजेट में जोड़ और निकाल सकता हूं।एक टैब से एक अलग विंडो कैसे पॉप आउट करें पाइसाइड Qt

मैं जो करना चाहता हूं उसके पास "पॉप-आउट" बटन है जो बच्चे विजेट को टैब विजेट से हटाया जा सकता है और इसे अपनी स्वतंत्र विंडो (और "पॉप-इन" बटन डालने के लिए) यह मुख्य खिड़की में वापस)। Gtalk-in-Gmail के समान विचार है। ध्यान दें कि यदि मैं मुख्य विंडो बंद करता हूं, तो अन्य "टैब" या "विंडोज़" को भी बंद करना चाहिए, और मैं सभी खिड़कियों को एक तरफ रख सकता हूं और उन्हें एक ही समय में सभी दृश्यमान और अद्यतन कर सकता हूं। (मैं निकट-रीयलटाइम डेटा प्रदर्शित करूँगा)।

मैं क्यूटी के लिए नया हूं, लेकिन अगर मुझे गलत नहीं लगता है, तो अगर कोई विजेट नहीं है तो यह स्वतंत्र रूप से आता है। यह काम करता है, लेकिन मैं तो पता नहीं मैं कैसे में वापस "पॉप" खिड़की सकता है।

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

मेरे पेट का कहना है कि अभी भी दोनों के बीच एक माता पिता/बच्चे संबंध होना चाहिए।

क्या माता-पिता को रखने का कोई तरीका है लेकिन अभी भी खिड़की स्वतंत्र रूप से आती है, या क्या मैं क्यूटी की शैली को गलत समझ रहा हूं?

अन्यथा, मुख्य विंडो (जैसे self.parentalUnit = self.parent()) के लिए एक लिंक रखने के लिए बच्चे में एक चर बना देगा, एक अच्छा विचार या हैकिश/क्लूडी विचार हो सकता है?

उत्तर

10

parent के रूप में छोड़ दो है। यदि आप parent हटाते हैं, तो मुख्य विंडो बंद करने से 'फ़्लोटिंग' टैब बंद नहीं होंगे, क्योंकि अब वे शीर्ष-स्तरीय विंडो हैं। windowFlags परिभाषित करता है कि कोई विजेट विंडो या बाल विजेट है या नहीं। मूल रूप से, आप वैकल्पिक करने के लिए QtCore.Qt.Window और QtCore.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

क्यूटी में, लेआउट लेआउट में जोड़े गए विजेट्स पर स्वामित्व लेता है, इसलिए इसे माता-पिता को संभालने दें। आप एक और विजेट (बिना माता-पिता के) बना सकते हैं जो तब तक छिपा होगा जब तक कि आप पॉप-आउट बटन दबाएंगे और जब इसे दबाया जाए, तो आप अपने मूल लेआउट से "पॉप-आउट विजेट" हटा दें और इसे छुपा विजेट के लेआउट में जोड़ें। और जब पॉप-इन बटन दबाया गया - विजेट को इसके मूल लेआउट पर वापस लाएं। इस छिपा विंडो को बंद करने के लिए जब मुख्य विंडो को बंद करने के लिए, आप कुछ इस तरह के closeEvent(QCloseEvent* ev) को फिर से परिभाषित करने की आवश्यकता होगी (C++ के लिए खेद है, लेकिन मैं शर्त लगा सकता, अजगर में यह सब एक ही है):

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 
} 
संबंधित मुद्दे