Размещение виджета в QMainWindow, как позиционировать вместо setCentralWidget - PullRequest
0 голосов
/ 28 октября 2018

Я использую 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()

1 Ответ

0 голосов
/ 28 октября 2018

Вы должны установить Stretch в строке 2, но перед этим вы должны исправить строкуSpan в:

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

Чтобы понять, давайте рассмотрим документы :

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

Thisперегруженная функция.

Эта версия добавляет данный виджет в сетку ячеек, охватывающую несколько строк / столбцов.Ячейка начнется с 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...