PyQt Pencere En/Boy Oranı Koruyarak Yeniden Boyutlandırma

Herkese Merhaba.
PySide/PyQt5 uygulamamda bir pencereyi başlangıçtaki genişlik/yükseklik oranını koruyarak yeniden boyutlandırmak istiyorum. yatay boyutlandırmada dikey de uzaması lazım oranı koruyacak şekilde. Dikey için de yatay aynı şekilde.

Çalışan kod şu şekilde:

class PdfPageCombinator(QMainWindow):

def __init__(self):
    super().__init__()
    #self.ui = Ui_MainWindow()
    #self.ui.setupUi(self)
    
    self.setGeometry(0, 0, 978, 822)

     # Pencerenin başlangıç boyutlarını alıyoruz
    self.initial_width = self.width()
    self.initial_height = self.height()

    # Başlangıç en/boy oranını hesaplıyoruz
    self.aspect_ratio = round(self.initial_width / self.initial_height,2)
    print("self.aspect_ratio:",self.aspect_ratio)
    
    self.show()
    
def resizeEvent(self, event):
    new_width = event.size().width()
    new_height = event.size().height()
   

    #print("new_width:",new_width,"new_height:",new_height)    
    
    if new_height != self.initial_height:
        new_height = self.height()
        print("dikey değişiyor...")
        
        # Genişliği en/boy oranına göre yeniden hesapla
        new_width = int(new_height * self.aspect_ratio)  
    
    elif new_width != self.initial_width:
        new_width = self.width()
        print("yatay değişiyor...")  
        #Yüksekliği en/boy oranına göre yeniden hesapla
        new_height = int(new_width / self.aspect_ratio)
    
           
    self.resize(new_width, new_height)        
    
    # Orijinal resizeEvent'i çalıştır
    super().resizeEvent(event)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = PdfPageCombinator()
    sys.exit(app.exec_())     

burada dikey veya çapraz uzatırsam ya da kısaltırsam sorunsuz istediğimi yapar. Ama yatayda ilk kez uzatırsam tek sefer yapar sonra yapmaz.

Vakit ayırıp bakacak herkese şimdiden teşekkürler.

Buna biraz baktim, genel olarak yapilamaz gibi duruyor.

Sizin yaptiginiz gibi resize event’iyle yapmaya calisan birkac kisi var, tam calismadigini soyluyorlar. Dokumentasyonun kendisi resizeEvent icinden resize cagrilmamasi gerektigini soyluyor.

Sanirim en iyisi icerideki layout’a QSizePolicy vermek—burada dogrudan aspect ratio verilebiliyor. Sonra belki resize sonrasi layout hangi boyuta geldiyse pencere ona resize edilebilir.

1 Beğeni

Evet resizeEvent içinde resize çağırınca lag yapıyor ama istediğime en yakın sonucu böyle elde ettim. Hiçbir chatbotun verdiği çözüm çalışmadı. Herhalde bu kadarı ile yetineceğim. QSizePolicy için yatay-dikey expand yaptım ama benim projemde labelların en/boy oranını koruması gerekiyordu. Onların da hep expand boyutunu değil fixed olanı veriyor diye pencereyi boyutlandırmaya baktım.