PDA

View Full Version : [SOLVED] [PyQT] QTableview refuses to grow past specified minimum size.



ToddWalter
4th August 2010, 14:39
If I expand a column it will pop a horizontal scroll bar instead of using more screen real estate. Where have I gone wrong? I hope I've included enough info.

Thanks,

Todd



class MainWin(QtGui.QMainWindow):
"""
Inherited from the definition imported from Qt Designer / pyuic construct ThetaMat.ui
"""
def __init__(self):
QtGui.QDialog.__init__(self)
self.ui = Ui_mainWindow()
self.ui.setupUi(self)
self.ui.statusbar.showMessage('Welcome')
self.setWindowState(QtCore.Qt.WindowMaximized)
self.ui.mdiArea.show()
self.setCentralWidget(self.ui.mdiArea)
# remember to setup slots / signals here
self.ui.actionAbout_ThetaMat.triggered.connect(sel f.myAbout)
self.ui.actionView_Current_List.triggered.connect( self.InvGrid)

def InvGrid(self):
# see if we already exist (prevents duplicate windows)

test = self.ui.mdiArea.findChild(QtGui.QWidget, 'InvList')

if test:
print 'Raising existing Inventory List'
test.setFocus()
test.setWindowState(test.windowState() | QtCore.Qt.WindowMaximized)

else:
print 'Creating Inventory List'
# create a child window for the grid (need the 'X' in the corner!)
tableWidget = QtGui.QMdiSubWindow(self.ui.mdiArea)
tableWidget.setSizePolicy(QtGui.QSizePolicy.Maximu m, QtGui.QSizePolicy.Maximum)
tableWidget.setWindowTitle('Current Inventory')

# put a qtableview in the child window
invTable = QtGui.QTableView(tableWidget)
invTable.setSortingEnabled(True)

invTable.setMinimumSize(800, 500)
invTable.setMaximumSize(16777215, 16777215)
invTable.setColumnWidth(0,80)
invTable.setColumnWidth(1,250)
invTable.setColumnWidth(2,40)
invTable.setColumnWidth(3,80)
invTable.setColumnWidth(4,45)
invTable.setColumnWidth(5,80)
invTable.setColumnWidth(6,80)
invTable.setColumnWidth(7,45)
invTable.setSizePolicy(QtGui.QSizePolicy.Expanding , QtGui.QSizePolicy.Expanding)


# populate the grid

logindb = pyodbc.connect('DSN=MyDSN;PWD=MyPw')
invcursor = logindb.cursor()
invcursor.execute('select count (*) from Inventory')
row = invcursor.fetchone()
totalrows = row[0]
print "Total rows in inventory = %i" %(int(totalrows))
invcursor.execute('select * from Inventory;')
currenttablerow = 0
invModel = QtGui.QStandardItemModel(totalrows,8)

for record in invcursor:
invModel.setItem(currenttablerow, 0, QtGui.QStandardItem(record[0]))
invModel.setItem(currenttablerow, 1, QtGui.QStandardItem(record[1]))
invModel.setItem(currenttablerow, 2, QtGui.QStandardItem(str(record[2])))
invModel.setItem(currenttablerow, 3, QtGui.QStandardItem(record[3]))
invModel.setItem(currenttablerow, 4, QtGui.QStandardItem(str(record[4])))
invModel.setItem(currenttablerow, 5, QtGui.QStandardItem(record[5]))
invModel.setItem(currenttablerow, 6, QtGui.QStandardItem(record[6]))
invModel.setItem(currenttablerow, 7, QtGui.QStandardItem(record[7]))
currenttablerow += 1

invModel.setHeaderData(0, QtCore.Qt.Horizontal, 'Category', role=QtCore.Qt.DisplayRole)
invModel.setHeaderData(1, QtCore.Qt.Horizontal, 'Item Description', role=QtCore.Qt.DisplayRole)
invModel.setHeaderData(2, QtCore.Qt.Horizontal, 'Tray #', role=QtCore.Qt.DisplayRole)
invModel.setHeaderData(3, QtCore.Qt.Horizontal, 'Parent Item', role=QtCore.Qt.DisplayRole)
invModel.setHeaderData(4, QtCore.Qt.Horizontal, 'Weight', role=QtCore.Qt.DisplayRole)
invModel.setHeaderData(5, QtCore.Qt.Horizontal, 'Dimension', role=QtCore.Qt.DisplayRole)
invModel.setHeaderData(6, QtCore.Qt.Horizontal, 'Detail #', role=QtCore.Qt.DisplayRole)
invModel.setHeaderData(7, QtCore.Qt.Horizontal, 'Material', role=QtCore.Qt.DisplayRole)

invHeader = invTable.horizontalHeader()

self.ui.statusbar.showMessage('Displaying Active Inventory')
invTable.setModel(invModel)
invHeader.ResizeMode(QtGui.QHeaderView.Stretch)
invHeader.setStretchLastSection(True)
invTable.updateGeometry()
invTable.showMaximized()

# update the list
tableWidget.setObjectName('InvList')
#show the widget
tableWidget.setWindowState(tableWidget.windowState () | QtCore.Qt.WindowMaximized)
tableWidget.showMaximized()

ToddWalter
4th August 2010, 19:50
After a careful re-read of the documentation of QMDISubWindow, I noticed that a sub-window has its own 'central widget' (referred to as the internal widget). Adding the table directly to the sub-window (not to mention not parenting everything in an unwieldy chain) solved all the issues I had. :o



# inherit the main ui
class MainWin(QtGui.QMainWindow):
"""
Inherited from the definition imported from Qt Designer / pyuic construct ThetaMat.ui
"""
def __init__(self):
QtGui.QDialog.__init__(self)
self.ui = Ui_mainWindow()
self.ui.setupUi(self)
self.ui.statusbar.showMessage('Welcome')
self.setWindowState(QtCore.Qt.WindowMaximized)
self.ui.mdiArea.show()
self.setCentralWidget(self.ui.mdiArea)
# remember to setup slots / signals here
self.ui.actionAbout_ThetaMat.triggered.connect(sel f.myAbout)
self.ui.actionView_Current_List.triggered.connect( self.InvGrid)

def InvGrid(self):
# see if we already exist (prevents duplicate windows)

test = self.ui.mdiArea.findChild(QtGui.QWidget, 'InvList')

if test:
print 'Raising existing Inventory List'
test.setFocus()
test.setWindowState(test.windowState() | QtCore.Qt.WindowMaximized)

else:
print 'Creating Inventory List'
# create a child window for the grid (need the 'X' in the corner!)
print 'creating sub window'
subWindow = QtGui.QMdiSubWindow(self.ui.mdiArea)
subWindow.setWindowTitle('Current Inventory')

print 'creating table'
# put a qtableview in the child window
invTable = QtGui.QTableView()
invTable.setSortingEnabled(True)

invTable.setMinimumSize(800, 500)
invTable.setMaximumSize(16777215, 16777215)
invTable.setColumnWidth(0,80)
invTable.setColumnWidth(1,250)
invTable.setColumnWidth(2,40)
invTable.setColumnWidth(3,80)
invTable.setColumnWidth(4,45)
invTable.setColumnWidth(5,80)
invTable.setColumnWidth(6,80)
invTable.setColumnWidth(7,45)
invTable.setSizePolicy(QtGui.QSizePolicy.Expanding , QtGui.QSizePolicy.Expanding)

# populate the grid
print 'populating table'
logindb = pyodbc.connect('DSN=MyDSN;PWD=MyPwd')
invcursor = logindb.cursor()
invcursor.execute('select count (*) from Inventory')
row = invcursor.fetchone()
totalrows = row[0]
print "Total rows in inventory = %i" %(int(totalrows))
invcursor.execute('select * from Inventory;')
currenttablerow = 0
invModel = QtGui.QStandardItemModel(totalrows,8)

for record in invcursor:
invModel.setItem(currenttablerow, 0, QtGui.QStandardItem(record[0]))
invModel.setItem(currenttablerow, 1, QtGui.QStandardItem(record[1]))
invModel.setItem(currenttablerow, 2, QtGui.QStandardItem(str(record[2])))
invModel.setItem(currenttablerow, 3, QtGui.QStandardItem(record[3]))
invModel.setItem(currenttablerow, 4, QtGui.QStandardItem(str(record[4])))
invModel.setItem(currenttablerow, 5, QtGui.QStandardItem(record[5]))
invModel.setItem(currenttablerow, 6, QtGui.QStandardItem(record[6]))
invModel.setItem(currenttablerow, 7, QtGui.QStandardItem(record[7]))
currenttablerow += 1

invModel.setHeaderData(0, QtCore.Qt.Horizontal, 'Category', role=QtCore.Qt.DisplayRole)
invModel.setHeaderData(1, QtCore.Qt.Horizontal, 'Item Description', role=QtCore.Qt.DisplayRole)
invModel.setHeaderData(2, QtCore.Qt.Horizontal, 'Tray #', role=QtCore.Qt.DisplayRole)
invModel.setHeaderData(3, QtCore.Qt.Horizontal, 'Parent Item', role=QtCore.Qt.DisplayRole)
invModel.setHeaderData(4, QtCore.Qt.Horizontal, 'Weight', role=QtCore.Qt.DisplayRole)
invModel.setHeaderData(5, QtCore.Qt.Horizontal, 'Dimension', role=QtCore.Qt.DisplayRole)
invModel.setHeaderData(6, QtCore.Qt.Horizontal, 'Detail #', role=QtCore.Qt.DisplayRole)
invModel.setHeaderData(7, QtCore.Qt.Horizontal, 'Material', role=QtCore.Qt.DisplayRole)

invHeader = invTable.horizontalHeader()
print'updating status bar'
self.ui.statusbar.showMessage('Displaying Active Inventory')
invTable.setModel(invModel)
invHeader.ResizeMode(QtGui.QHeaderView.Stretch)
invHeader.setStretchLastSection(True)
print 'show tableWidget'
# update the list
subWindow.setObjectName('InvList')
subWindow.setWidget(invTable)
subWindow.showMaximized()