Search code examples
pythonqtpyqtpyqt5

Can i resize the pyqt5 window by stretching it and keeping the original aspect ratio (without layouts)


I made a ui that dont uses layouts but when i made it full screen buttons just stayed top left corner and seemed very small.

Pixelation doesn't matter for me i just wanna make things bigger. (when the resolution is 1920x1080 it'll be normal but when we made it 4k, things will be 4x bigger)

Is stretching all the window content possible with pyqt5?

Like this example that i made in mspaint:

enter image description here

enter image description here

main code ⬇️

from PyQt5.QtWidgets import QMainWindow, QApplication
import sys
from converted_ui import Ui_MainWindow

class MainUI(QMainWindow):
    def __init__(self):
        super(MainUI, self).__init__()

        # Initialize the user interface
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    ui = MainUI()
    ui.show()
    sys.exit(app.exec_())

converted_ui ⬇️

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(70, 80, 250, 250))
        self.pushButton.setObjectName("pushButton")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(465, 170, 106, 46))
        self.label.setObjectName("label")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 26))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "PushButton"))
        self.label.setText(_translate("MainWindow", "Lorem Ipsum"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

Solution

  • Yes, you can and the resizeEvent() method is where you you can change the size and location of widgets.

    But this is not practical and it is better to use layout managers.

    import sys
    from PyQt5 import QtCore, QtGui, QtWidgets
    from PyQt5.QtWidgets import QMainWindow, QApplication
    
    #from converted_ui import Ui_MainWindow
    class Ui_MainWindow(object):
        def setupUi(self, MainWindow):
            MainWindow.setObjectName("MainWindow")
            MainWindow.resize(800, 600)
            self.centralwidget = QtWidgets.QWidget(MainWindow)
            self.centralwidget.setObjectName("centralwidget")
            
            self.pushButton = QtWidgets.QPushButton(self.centralwidget)
    # ---------------------------------------------> vvvvvvvvvvvvvvvv <----  
    #       self.pushButton.setGeometry(QtCore.QRect(70, 80, 250, 250))      
            self.pushButton.setGeometry(QtCore.QRect(80, 60, 200, 200))
            self.pushButton.setObjectName("pushButton")
            
            self.label = QtWidgets.QLabel(self.centralwidget)
    # ----------------------------------------> vvvvvvvvvvvvvvvvv <----        
    #       self.label.setGeometry(QtCore.QRect(465, 170, 106, 46))
            self.label.setGeometry(QtCore.QRect(460, 60, 200, 200))
            
            self.label.setObjectName("label")
            
            MainWindow.setCentralWidget(self.centralwidget)
            self.menubar = QtWidgets.QMenuBar(MainWindow)
            self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 26))
            self.menubar.setObjectName("menubar")
            MainWindow.setMenuBar(self.menubar)
            self.statusbar = QtWidgets.QStatusBar(MainWindow)
            self.statusbar.setObjectName("statusbar")
            MainWindow.setStatusBar(self.statusbar)
    
            self.retranslateUi(MainWindow)
            QtCore.QMetaObject.connectSlotsByName(MainWindow)
    
        def retranslateUi(self, MainWindow):
            _translate = QtCore.QCoreApplication.translate
            MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
            self.pushButton.setText(_translate("MainWindow", "PushButton"))
            self.label.setText(_translate("MainWindow", "Lorem Ipsum"))
            
    
    class MainUI(QMainWindow, Ui_MainWindow):
        def __init__(self):
            super(MainUI, self).__init__()
    
            self.setupUi(self)
            
            self.label.setStyleSheet("background-color: #1E5F74; color: #47F5E1;")
            self.label.setAlignment(QtCore.Qt.AlignCenter)
            self.w = 800
            self.h = 600
            self.x = 80
            self.y = 60
            self.setMinimumSize(self.w/3, self.h/3)
            self.widthFactor  = 1
            self.heightFactor = 1
            
        def resizeEvent(self, event):
            self.widthFactor  = self.rect().width() / 800
            self.heightFactor = self.rect().height()/ 600  
            w = self.w * 0.25 * self.widthFactor
    
            self.pushButton.resize(w, w)
            self.pushButton.move(self.x * self.widthFactor , self.y * self.heightFactor)
            
            self.label.resize(w, w)
            self.label.move((self.x * self.widthFactor + w * 2), self.y * self.heightFactor)
    
            super(MainUI, self).resizeEvent(event)
    
    
    if __name__ == "__main__":
        app = QApplication(sys.argv)
        ui = MainUI()
        ui.show()
        sys.exit(app.exec_())
    

    enter image description here

    enter image description here