[PyQt] (no subject)

Nate Reid gnatty7 at hotmail.com
Thu Oct 7 19:00:48 BST 2010


Below is a sample program that demonstrates a problem with the updating of a Tab's size when setTabsClosable(false) is dynamically set.
Run the program as is and add some tabs, and then remove some with either the close box or the 'Remove' button.  When the last tab is shown, you'll see that it remains wide enough to contain the 'X' close button, even though it is not drawn.

Use the 'Toggle Fix" button and add and remove tabs again to see the way the tabs should be redrawn when the 'X' box is removed on the last tab.

I think this is a problem with QT itself. I've tested this running on Qt 4.5.x and 4.6.x

I've tried a QTimer to force an update and that doesn't seem to work in either Python or C++

Has this been fixed in a newer version of Qt, e.g. 4.7.x?

-Nate

---- begin test.py ----

#!/bin/env python
import sys

from PyQt4 import QtCore
from PyQt4 import QtGui

MIN_EDITORS = 1

class MainWindow(QtGui.QMainWindow):
    def __init__(self, *args):
        super(MainWindow, self).__init__(*args)
        self.widget = QtGui.QWidget(self)
        self.layout = QtGui.QVBoxLayout()
        self.widget.setLayout(self.layout)
        self.btnAdd = QtGui.QPushButton("Add")
        self.btnRem = QtGui.QPushButton("Remove")
        self.btnFix = QtGui.QPushButton("Toggle Fix")
        self.connect(self.btnAdd, QtCore.SIGNAL("clicked()"), self.addEditor)
        self.connect(self.btnRem, QtCore.SIGNAL("clicked()"), self.remEditor)
        self.connect(self.btnFix, QtCore.SIGNAL("clicked()"), self.toggleFix)
        self.tw = QtGui.QTabWidget(self)
        self.connect(self.tw, QtCore.SIGNAL("tabCloseRequested(int)"), self.remEditor)
        self.setCentralWidget(self.widget)
        self.layout.addWidget(self.tw)
        self.layout.addWidget(self.btnAdd)
        self.layout.addWidget(self.btnRem)
        self.layout.addWidget(self.btnFix)
        self.fix_tabs = False
        self.addEditor()
        
    def addEditor(self):
        widget = QtGui.QWidget()
        textedit = QtGui.QTextEdit(widget)
        layout = QtGui.QVBoxLayout()
        layout.addWidget(textedit)
        widget.setLayout(layout)
        self.tw.addTab(widget, "blah")
        self.tw.setTabsClosable(self.tw.count() > MIN_EDITORS);
        
    def remEditor(self, index=-1):
        if (self.tw.count() <= MIN_EDITORS):
            return
        if (index < 0):
            index = self.tw.currentIndex()
        self.tw.removeTab(index)
        self.tw.setTabsClosable(self.tw.count() > MIN_EDITORS);
        if self.fix_tabs:
            self.fixTabs()
    
    def fixTabs(self):
        tabBar = self.tw.tabBar()
        tabBar.setTabText(0, tabBar.tabText(0))

    def toggleFix(self):
        self.fix_tabs = not self.fix_tabs

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    mw = MainWindow()
    mw.show()
    sys.exit(app.exec_())

# ---- end test.py ----


 		 	   		  
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.riverbankcomputing.com/pipermail/pyqt/attachments/20101007/c7d523aa/attachment.html>


More information about the PyQt mailing list