【问题标题】:PyQt: remove blank space in QTableWidgetPyQt:删除 QTableWidget 中的空格
【发布时间】:2017-06-17 11:03:03
【问题描述】:

我想删除我在布局中放置的表格中的空白:

我想要这样的东西:

这是我的代码:

import sys
from PyQt4 import QtGui
from PyQt4.QtGui import * 
from PyQt4.QtSql import * 
from PyQt4.QtCore import * 
import sys


class Example(QMainWindow):

    def __init__(self):
        super(Example, self).__init__()
        self.initUI()


    def initUI(self):


        self.resize(640, 480)
        self.center()
        self.setWindowTitle('')
        self.setWindowIcon(QtGui.QIcon('icon.ico')) 

        exitAction = QtGui.QAction(QtGui.QIcon('exit.png'), '&Exit', self)        
        exitAction.setShortcut('Ctrl+Q')
        exitAction.setStatusTip('Exit application')
        exitAction.triggered.connect(QtGui.qApp.quit)

        self.toolbar = self.addToolBar('Exit')
        self.toolbar.addAction(exitAction)



        menubar = self.menuBar()
        fileMenu = menubar.addMenu('&File')
        fileMenu.addAction(exitAction)

        table = QTableWidget()
        db = QSqlDatabase.addDatabase("")
        db.setDatabaseName('xxx.db')

        db.open()

        query = QSqlQuery ("xxxx")
        queryCount = QSqlQuery ("xxxx")
        queryCount.next()
        numberUserRow = queryCount.value(0).toInt()
        table.setColumnCount(2)
        table.setRowCount(numberUserRow[0])

        table.setHorizontalHeaderItem(0, QTableWidgetItem("Post"));
        table.setHorizontalHeaderItem(1, QTableWidgetItem("Data"));


        MSG_POST = 3
        DATA_SALVATAGGIO_POST = 4
        index=0
        while (query.next()):
            table.setItem(index,0,QTableWidgetItem(query.value(MSG_POST).toString()))
            table.setItem(index,1,QTableWidgetItem(query.value(DATA_SALVATAGGIO_POST).toString()))    
            index = index+1

        self.statusBar().showMessage('Ready')
        window = QWidget()

        mainLayout = QGridLayout()

        verticalLayout = QVBoxLayout()
        horizontalLayout = QHBoxLayout()

        horizontalLayout.addWidget(table)
        verticalLayout.addLayout(horizontalLayout)

        mainLayout.addLayout(verticalLayout,0,0)

        window.setLayout(mainLayout)


        self.setCentralWidget(window);
        self.show()


    def center(self):
        qr = self.frameGeometry()
        cp = QtGui.QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())        

def main():

    app = QtGui.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()    

我尝试在我的表格右侧放置一个按钮,这有助于我调整表格本身的大小。但是我不需要使用按钮,那么如何固定表格的宽度?

【问题讨论】:

    标签: python qt layout pyqt qtablewidget


    【解决方案1】:

    最好的方法是在表格右侧使用QSpacerItem

        horizontalSpacer = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Expanding, QSizePolicy.Expanding)
        horizontalLayout.addWidget(table)
        # Add the widget and the spacer to the horizontal layout
        horizontalLayout.addItem(horizontalSpacer)
    

    此外,您需要将小部件水平 sizePolicy 设置为最小,以消除表格中剩余的空白。为此,有不同的选择,具体取决于您的需要。您可以将大小拉伸到this 之后的内容,或者放置一个固定大小,这可能是获得最接近您的图像的最佳结果:

        table.setSizePolicy(QtGui.QSizePolicy.Minimum,QtGui.QSizePolicy.Expanding)
        header = table.horizontalHeader()
        table.setMaximumWidth(header.length())
        table.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
    

    结果显示here

    【讨论】:

      【解决方案2】:

      这可以像这样非常简单地实现:

          horizontalLayout.addWidget(table)
          horizontalLayout.addStretch()
          table.horizontalHeader().setResizeMode(QHeaderView.Stretch)
      

      这将添加一个扩展间隔,将表格推到左侧,它还会使表格列拉伸以填充可用空间。

      如果您不希望在主窗口调整大小时调整表格大小,请执行以下操作:

          horizontalLayout.addStretch(1)
      

      设置拉伸因子优先考虑间隔,因此表格将固定在其最小宽度。如果您愿意,当然可以进行调整:

          table.setMinimumWidth(400)
      

      【讨论】:

      • 这会扩展表格以填充小部件,但不会缩小小部件以适合表格,这是 OP 要求的。
      • @CodingCat。 OP 要求“删除我在布局中放置的表格中的空白区域”,并显示所需结果的屏幕截图,表格具有最小宽度并与左侧对齐。这正是我的代码所做的(我知道这一点,因为我测试了它)。我还测试了另一个答案,它根本无法正常工作。它裁剪桌子的右侧,并将其与窗口的中心对齐 - OP 当然没有要求。 (PS:我不知道您所说的“扩展表格以填充小部件”是什么意思。我的代码正好相反)。