2016-02-26 226 views
1

我正在開發一個相當簡單的PyQt程序,它基本上只是一個QTableWidget項目。我的目標是根據父母的大小QTableWidget自動調整項目的寬度和高度。例如,如果我調小窗口大小,項目的寬度和高度應該減小,但應保持相同數量的項目,並且項目仍應完全填充父項QTableWidget。如您所見,我目前使用setColumnWidthsetRowHeight來手動設置寬度和高度。PyQt4 QTableWidget:設置行寬和列高度以填充父窗口小部件

我已經嘗試了以下堆棧溢出問題的建議,以及其他許多問題和網站,其中沒有一個做我正在嘗試做的事情。

1. How to make qtablewidgets columns assume the maximum space

2. pyqt how to maximize the column width in a tableview

這裏是我目前使用的代碼:

from PyQt4 import QtGui, QtCore 
import PyQt4.Qt 

class Window(QtGui.QWidget): 
    def __init__(self, rows, columns): 
     super(Window, self).__init__() 
     self.setWindowState(QtCore.Qt.WindowMaximized) 
     self.table = QtGui.QTableWidget(rows, columns, self) 
     self.table.verticalHeader().setVisible(False) 
     self.table.horizontalHeader().setVisible(False) 

     # this is what I am currently using to set the row and column size 
     for x in range(columns): 
      self.table.setColumnWidth(x, 13) 
     for x in range(rows): 
      self.table.setRowHeight(x, 13) 
     for row in range(rows): 
      for column in range(columns): 
       item = QtGui.QTableWidgetItem() 
       self.table.setItem(row, column, item) 

     layout = QtGui.QGridLayout(self) 
     layout.addWidget(self.table, 0, 0, 1, 6) 

     self.show() 


def main(): 
    import sys 
    app = QtGui.QApplication(sys.argv) 
    window = Window(54, 96) 
    sys.exit(app.exec_()) 

if __name__ == "__main__": 
    main() 

我appoligize對這一問題的長度,但我想讓我的問題很清楚。預先感謝您的幫助!

回答

0

您可以使用QItemDelegate並覆蓋sizeHint方法來執行此操作。然後覆蓋您的主小部件的resizeEventshowEvent方法,以在小部件調整大小時更新每個單元格的大小。

import sys 
from PyQt4 import QtGui, QtCore 


class MyDelegate(QtGui.QItemDelegate): 

    def __init__(self, parent, table): 
     super(MyDelegate, self).__init__(parent) 
     self.table = table 

    def sizeHint(self, option, index): 
     # Get full viewport size 
     table_size = self.table.viewport().size() 
     gw = 1 # Grid line width 
     rows = self.table.rowCount() or 1 
     cols = self.table.columnCount() or 1 
     width = (table_size.width() - (gw * (cols - 1)))/cols 
     height = (table_size.height() - (gw * (rows - 1)))/rows 
     return QtCore.QSize(width, height) 


class Window(QtGui.QWidget): 
    def __init__(self, rows, columns): 
     super(Window, self).__init__() 
     self.lay = QtGui.QVBoxLayout() 
     self.setLayout(self.lay) 
     self.table = QtGui.QTableWidget(rows, columns, self) 
     self.table.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) 
     self.table.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) 
     self.lay.addWidget(self.table) 
     self.delegate = MyDelegate(self, self.table) 
     self.table.setItemDelegate(self.delegate) 

    def showEvent(self, event): 
     super(Window, self).showEvent(event) 
     self.resizeTable() 

    def resizeTable(self): 
     self.table.resizeRowsToContents() 
     self.table.resizeColumnsToContents() 

    def resizeEvent(self, event): 
     super(Window, self).resizeEvent(event) 
     self.resizeTable() 
+0

我累了你的代碼,它完全填滿了表。但它並不在窗口的範圍內。有沒有一種方法可以讓它在沒有超出窗口的情況下填滿窗戶? – MarkyPython

+0

「超越窗口」是什麼意思?你可以張貼截圖嗎? –

+0

[這裏](http://i.stack.imgur.com/DTGAn.png)是截圖。我有更多的列和行比在屏幕上顯示的更多。 – MarkyPython

相關問題