【问题标题】:Placing a widget in QMainWindow, how to position instead of setCentralWidget在QMainWindow中放置一个小部件,如何定位而不是setCentralWidget
【发布时间】:2019-08-27 00:31:12
【问题描述】:

我正在使用 QGridLayout,通过使用 setCentralWidget 函数,行和列 (0,0) 从窗口的中心开始,这会留下很多空白空间。

如何让它居中但从窗口顶部开始而不是在中间?

我对 Qt 很陌生,想知道我是否处理错了?我应该改为为 QWidget 创建一个新类吗?

class App(QMainWindow):
    def __init__(self):
        super().__init__()
        self.title = 'Data visualizing'
        self.left = 50
        self.top = 50
        self.width = 300
        self.height = 100
        self.initUI()

    def initUI(self):
        self.central_widget = QWidget()
        self.setCentralWidget(self.central_widget)

        # Create textbox
        self.textbox = QLineEdit(self)
        self.textbox.setReadOnly(True)

        # Create textbox 2
        self.textbox2 = QLineEdit(self)
        self.textbox2.setReadOnly(True)

        # Create button
        self.button = QPushButton('Load file 1', self)
        self.button.setToolTip('Click here to browse for the first data file')
        self.button.clicked.connect(self.on_click)

        # Create button 2
        self.button2 = QPushButton('Load file 2', self)
        self.button2.setToolTip('Click here to browse for the first data file')
        self.button2.clicked.connect(self.on_click)

        grid = QGridLayout()

        grid.addWidget(self.textbox, 0, 0, 0, 3)
        grid.addWidget(self.textbox2, 0, 3, 0, 3)
        grid.addWidget(self.button, 1, 1, 1, 1)
        grid.addWidget(self.button2, 1, 4, 1, 1)

        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)

        self.centralWidget().setLayout(grid)
        self.show()

    def openFileNameDialog(self):
        options = QFileDialog.Options()
        options |= QFileDialog.DontUseNativeDialog
        fileName, _ = QFileDialog.getOpenFileName(self, "QFileDialog.getOpenFileName()", "",
                                                  "All Files (*);;Comma seperated files (*.csv)", options=options)
        if fileName:
            self.textbox.setText(fileName)
            print(fileName)

    @pyqtSlot()
    def on_click(self):
        self.openFileNameDialog()
        print('PyQt5 button click')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = App()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

【问题讨论】:

    标签: python pyqt pyqt5


    【解决方案1】:

    您必须在第 2 行建立一个 Stretch,但在此之前您必须更正 rowSpan :

    grid.addWidget(self.textbox, 0, 0, 0, 3)
    grid.addWidget(self.textbox2, 0, 3, 0, 3)
    

    要了解,我们回顾一下the docs

    void QGridLayout::addWidget(QWidget *widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, Qt::Alignment 对齐 = ...)

    这是一个重载函数。

    此版本将给定的小部件添加到单元格网格中,跨越多个 行/列。单元格将从 fromRow 开始,fromColumn 跨越 rowSpan 行和 columnSpan 列。小部件将具有给定的 对齐。

    如果 rowSpan 和/或 columnSpan 为 -1,则小部件将分别延伸到底部和/或右侧边缘。

    也就是说,rowSpan 表示小部件将占用多少行,但您将其指示为 0,因此布局将不再处理大小而仅处理位置,您必须将其更改为 1。

    import sys
    from PyQt5 import QtCore, QtGui, QtWidgets
    
    
    class App(QtWidgets.QMainWindow):
        def __init__(self):
            super().__init__()
            self.title = 'Data visualizing'
            self.left, self.top, self.width, self.height = 50, 50, 300, 100
            self.initUI()
    
        def initUI(self):
            self.central_widget = QtWidgets.QWidget()
            self.setCentralWidget(self.central_widget)
    
            # Create textboxs
            self.textbox = QtWidgets.QLineEdit(readOnly=True)
            self.textbox2 = QtWidgets.QLineEdit(readOnly=True)
    
            # Create buttons
            self.button = QtWidgets.QPushButton('Load file 1', 
                toolTip = 'Click here to browse for the first data file')
            self.button.clicked.connect(self.on_click)
            self.button2 = QtWidgets.QPushButton('Load file 2',
                toolTip = 'Click here to browse for the first data file')
            self.button2.clicked.connect(self.on_click)
    
            grid = QtWidgets.QGridLayout(self.centralWidget())
    
            grid.addWidget(self.textbox, 0, 0, 1, 3)
            grid.addWidget(self.textbox2, 0, 3, 1, 3)
            grid.addWidget(self.button, 1, 1, 1, 1)
            grid.addWidget(self.button2, 1, 4, 1, 1)
            grid.setRowStretch(2, 1)
    
            self.setWindowTitle(self.title)
            self.setGeometry(self.left, self.top, self.width, self.height)
            self.show()
    
        def openFileNameDialog(self):
            options = QtWidgets.QFileDialog.Options()
            options |= QtWidgets.QFileDialog.DontUseNativeDialog
            fileName, _ = QtWidgets.QFileDialog.getOpenFileName(self, "QFileDialog.getOpenFileName()", "",
                                                      "All Files (*);;Comma seperated files (*.csv)", options=options)
            if fileName:
                self.textbox.setText(fileName)
                print(fileName)
    
        @QtCore.pyqtSlot()
        def on_click(self):
            self.openFileNameDialog()
            print('PyQt5 button click')
    
    if __name__ == '__main__':
        app = QtWidgets.QApplication(sys.argv)
        ex = App()
        sys.exit(app.exec_())
    
    if __name__ == '__main__':
        main()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-15
      • 2017-04-09
      • 1970-01-01
      • 2011-01-18
      • 1970-01-01
      相关资源
      最近更新 更多