Как сделать, чтобы мои виджеты не отображались в центре

У меня все мои виджеты размещены в центре (кроме того, что слева, потому что я хочу, чтобы он был только там), как в сетке, так и в горизонтальном расположении. Позволь мне показать тебе :

все виджеты в центре

Я хочу, чтобы они располагались так, как на изображении ниже, а не все виджеты в центре, как на изображении выше:

все виджеты в углу и один в центре

Как видите, верхние находятся по углам, а один прямоугольник посередине находится в центре. Я хочу, чтобы они были размещены там, где я хочу, будь то между ними или в углу, но в то же время, не теряя моих сеток и добавленных интервалов, поскольку, когда вы растягиваете это по горизонтали / вертикали, это добавит больше / меньше места между виджеты. Как вы можете убедиться сами, растянув приложение.

Вот мой код:

import sys
from PySide2 import QtCore, QtGui, QtWidgets
from PySide2.QtGui import QCursor
from PySide2.QtWidgets import QFrame
from PySide2.QtCore import QRect

class MyWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super(MyWindow, self).__init__()
        self.initUI()

    def initUI(self):
        self.setGeometry(250, 80, 800, 600)
        self.setWindowTitle("test app")
        self.setStyleSheet("background-color: #ffffff; border")

        label = QtWidgets.QLabel(self)
        label.setFixedWidth(260)
        label.setStyleSheet("background-color: qlineargradient(spread:pad, x1:0.994, y1:0.527, x2:0.999682, y2:0.005, stop:0 rgba(246, 246, 246, 255), stop:1 rgba(255, 248, 248, 255));")

        lineedit = QtWidgets.QLineEdit()
        lineedit.setFixedWidth(310)
        lineedit.setFixedHeight(30)
        lineedit.setStyleSheet("""
        background-color: #ffffff; 
        border-width: 1px; 
        border-color: rgb(200, 200, 200); 
        border-style: solid;
        border-radius: 4;
        padding: 6px 12px;
        color: rgb(50,50,50);
        font-family: SourceSansPro-Regular;
        font-size: 12px;
        """)
        f = lineedit.font()
        f.setLetterSpacing(QtGui.QFont.PercentageSpacing, 100)
        lineedit.setFont(f)

        button = QtWidgets.QPushButton("New Product")
        button.setFixedSize(110, 28)
        button.setCursor(QCursor(QtCore.Qt.PointingHandCursor))
        button.setStyleSheet("""
        QPushButton {
        background-color: #474767;
        border: none;
        color: white;
        text-align: center;
        font-size: 14px;
        padding: 7px 10px;
        border-radius: 3;
        font-family: Source Sans Pro SemiBold;
        }
        QPushButton:hover{
        background-color: #474757;
        }
        """)

        button1 = QtWidgets.QPushButton("Delete Product")
        button1.setFixedSize(110, 28)
        button1.setCursor(QCursor(QtCore.Qt.PointingHandCursor))
        button1.setStyleSheet("""
        QPushButton {
        background-color: #474767;
        border: none;
        color: white;
        text-align: center;
        font-size: 14px;
        padding: 7px 10px;
        border-radius: 3;
        font-family: Source Sans Pro SemiBold;
        }
        QPushButton:hover{
        background-color: #474757;
        }
        """)

        button2 = QtWidgets.QPushButton("Next product")
        button2.setFixedSize(110, 28)
        button2.setCursor(QCursor(QtCore.Qt.PointingHandCursor))
        button2.setStyleSheet("""
        QPushButton {
        background-color: #474767;
        border: none;
        color: white;
        text-align: center;
        font-size: 14px;
        padding: 7px 10px;
        border-radius: 3;
        font-family: Source Sans Pro SemiBold;
        }
        QPushButton:hover{
        background-color: #474757;
        }
        """)

        widget = QtWidgets.QLabel()
        widget.setFixedSize(180, 180)
        widget.setStyleSheet("""background-color: rgb(200, 255, 250)""")

        central_widget = QtWidgets.QWidget()
        self.setCentralWidget(central_widget)

        right_container = QtWidgets.QWidget()

        glay = QtWidgets.QGridLayout(right_container)
        glay.addWidget(lineedit, 0, 0)
        glay.addWidget(widget, 1, 0)
        glay.addWidget(button, 2, 0)

        glay.addWidget(button1, 2, 1)

        glay.addWidget(button2, 0, 1)

        hlay = QtWidgets.QHBoxLayout(central_widget)
        hlay.setContentsMargins(0, 0, 0, 0)
        hlay.addWidget(label)
        hlay.addWidget(right_container)


def main():
    app = QtWidgets.QApplication(sys.argv)
    win = MyWindow()
    win.show()
    sys.exit(app.exec_())


if __name__ == "__main__":
    main()


Я пробовал много вещей, но в итоге с ошибками. У меня просто закончилась логика, о том, как этого добиться.

Заранее спасибо...

Редактировать 1: я попробовал обе эти вещи, которые были предложены в комментариях:

1) Добавление glay.addWidget(lineedit, 0, 0, alignment = QtCore.Qt.AlignTop | QtCore.Qt.AlignLeft). Он дает тот же результат даже после применения изменений.

2) Использование QVBoxLayout бесполезно. Что-то не позволяет мне добавлять виджеты в прямоугольник, который я рисую ниже. Потому что я не могу добавлять виджеты со стороны прямоугольника. (Смотрите картинку ниже...)

введите здесь описание изображения


person Abhay salvi    schedule 26.04.2020    source источник
comment
Не могли бы вы уточнить, что вы имеете в виду, говоря, что я хочу, чтобы они были размещены там, где я хочу? Было бы полезно, если бы вы могли показать нам пример изображения того, чего вы хотите достичь.   -  person musicamante    schedule 26.04.2020
comment
@musicamante О, извините за это. Пример изображения — второй. Я хочу этого добиться. И что я имел в виду, размещая виджеты там, где я хочу, так это то, что я могу разместить их либо в углу, либо в центре. Я просто хочу избавиться от всех виджетов из центра. Как вы можете видеть на первом изображении. Все виджеты под сеткой находятся в центре. Я хочу изображение 2 в качестве результата.   -  person Abhay salvi    schedule 26.04.2020
comment
Что ж, дать вам конкретный ответ сложно, так как это действительно зависит от виджетов, которые вы добавляете в макет. Например, метка в центре имеет фиксированный размер, поэтому ее размер никогда не изменится. То, чего вы хотите достичь, может быть достигнуто разными способами. Вы можете использовать аргумент выравнивания для угловых виджетов (например, glay.addWidget(lineedit, 0, 0, alignment=QtCore.Qt.AlignTop|QtCore.Qt.AlignLeft)). Или вы можете использовать вложенные макеты (используйте VBox вместо Grid для glay, добавьте QHBoxLayout для верхних виджетов и используйте addStretch() перед добавлением виджета справа). И так далее...   -  person musicamante    schedule 26.04.2020
comment
Пожалуйста, смотрите мое редактирование 1 в ответе. @musicamante   -  person Abhay salvi    schedule 26.04.2020


Ответы (1)


void QGridLayout::setColumnStretch (столбец int, растяжение int)

Устанавливает коэффициент растяжения столбца столбца на растяжение. Первый столбец имеет номер 0.


недействительным QGridLayout:: setRowStretch (целая строка, целое растяжение)

Устанавливает коэффициент растяжения строки строки на растяжение. Первая строка имеет номер 0.

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import QCursor
from PyQt5.QtWidgets import QFrame
from PyQt5.QtCore import QRect

class MyWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super(MyWindow, self).__init__()
        self.initUI()

    def initUI(self):
        self.setGeometry(250, 80, 800, 600)
        self.setWindowTitle("test app")
        self.setStyleSheet("background-color: #ffffff; border")

        label = QtWidgets.QLabel(self)
        label.setFixedWidth(260)
        label.setStyleSheet("background-color: qlineargradient(spread:pad, x1:0.994, y1:0.527, x2:0.999682, y2:0.005, stop:0 rgba(246, 246, 246, 255), stop:1 rgba(255, 248, 248, 255));")

        lineedit = QtWidgets.QLineEdit()
        lineedit.setFixedWidth(310)
        lineedit.setFixedHeight(30)
        lineedit.setStyleSheet("""
        background-color: #ffffff; 
        border-width: 1px; 
        border-color: rgb(200, 200, 200); 
        border-style: solid;
        border-radius: 4;
        padding: 6px 12px;
        color: rgb(50,50,50);
        font-family: SourceSansPro-Regular;
        font-size: 12px;
        """)
        f = lineedit.font()
        f.setLetterSpacing(QtGui.QFont.PercentageSpacing, 100)
        lineedit.setFont(f)

        button = QtWidgets.QPushButton("New Product")
        button.setFixedSize(110, 28)
        button.setCursor(QCursor(QtCore.Qt.PointingHandCursor))
        button.setStyleSheet("""
        QPushButton {
        background-color: #474767;
        border: none;
        color: white;
        text-align: center;
        font-size: 14px;
        padding: 7px 10px;
        border-radius: 3;
        font-family: Source Sans Pro SemiBold;
        }
        QPushButton:hover{
        background-color: #474757;
        }
        """)

        button1 = QtWidgets.QPushButton("Delete Product")
        button1.setFixedSize(110, 28)
        button1.setCursor(QCursor(QtCore.Qt.PointingHandCursor))
        button1.setStyleSheet("""
        QPushButton {
        background-color: #474767;
        border: none;
        color: white;
        text-align: center;
        font-size: 14px;
        padding: 7px 10px;
        border-radius: 3;
        font-family: Source Sans Pro SemiBold;
        }
        QPushButton:hover{
        background-color: #474757;
        }
        """)

        button2 = QtWidgets.QPushButton("Next product")
        button2.setFixedSize(110, 28)
        button2.setCursor(QCursor(QtCore.Qt.PointingHandCursor))
        button2.setStyleSheet("""
        QPushButton {
        background-color: #474767;
        border: none;
        color: white;
        text-align: center;
        font-size: 14px;
        padding: 7px 10px;
        border-radius: 3;
        font-family: Source Sans Pro SemiBold;
        }
        QPushButton:hover{
        background-color: #474757;
        }
        """)

        widget = QtWidgets.QLabel()
#        widget.setFixedSize(180, 180)
        widget.setMinimumHeight(180)                                           # +++

        widget.setStyleSheet("""background-color: rgb(200, 255, 250)""")

        central_widget = QtWidgets.QWidget()
        self.setCentralWidget(central_widget)

        right_container = QtWidgets.QWidget()

# ++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
        glay = QtWidgets.QGridLayout(right_container)
        glay.addWidget(lineedit, 0, 0)
        glay.addWidget(button2, 0, 2)
        
        glay.addWidget(widget, 2, 0, 1, 3)                              # 2
        
        glay.addWidget(button, 4, 0)                                    # 4
        glay.addWidget(button1, 4, 2)
      
        glay.setColumnStretch(1, 1)                                     # setColumnStretch
        glay.setRowStretch(1, 1)                                        # setRowStretch
        glay.setRowStretch(2, 2)                                        # setRowStretch
        glay.setRowStretch(3, 1)                                        # setRowStretch
# ++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

        hlay = QtWidgets.QHBoxLayout(central_widget)
        hlay.setContentsMargins(0, 0, 0, 0)
        hlay.addWidget(label)
        hlay.addWidget(right_container)


def main():
    app = QtWidgets.QApplication(sys.argv)
    win = MyWindow()
    win.show()
    sys.exit(app.exec_())


if __name__ == "__main__":
    main()  

введите здесь описание изображения

person S. Nick    schedule 26.04.2020
comment
Но не могли бы вы объяснить мне, что делает glay.addWidget(widget, 2, 0, 1, 3)? Также почему вы написали `.setRowStretch` 3 раза с разными значениями? Я не могу понять. Не могли бы вы объяснить мне это? @S-Ник - person Abhay salvi; 26.04.2020
comment
Я новичок в Pyqt и пытаюсь постепенно всему научиться. Ваша помощь высоко ценится. - person Abhay salvi; 26.04.2020
comment
@Abhaysalvi см. doc.qt.io/qt-5/qgridlayout.html #addWidget-2 - person S. Nick; 26.04.2020
comment
Спасибо! но я просто хочу задать вопрос. Я до сих пор не могу понять, что эти два значения делают здесь в setRowStretch(3, 1) и в столбце? Когда я помещаю любое произвольное число вместо 3 и 1, некоторые из них работают и дают тот же результат, а некоторые ведут себя странно. - person Abhay salvi; 26.04.2020
comment
@Abhaysalvi см. doc.qt.io/qt-5/qgridlayout.html#setRowStretch - person S. Nick; 26.04.2020