2016-06-30 23 views
1

Ich habe PyQt5 studiert und recentlty beschlossen, eine GUI für einen einfachen Chat-Client zu machen. Das ist mein Mockup:Gui für einen einfachen Chat in PyQt5 mit QGridLayout

PyQt5 simple chat GUI mockup

I verwendet QGridLayout, und das ist, was ich habe:

PyQt5 simple chat GUI example

Wie verringern wir die Größe des unteren QTextEdit, so hat es 2- 3 verfügbare Zeilen und QPushButton größer machen?

Mein Programm:

import sys 
from PyQt5.QtWidgets import (QMainWindow, QAction, QApplication, QDesktopWidget, 
          QDialog, QTextEdit, QGridLayout, QPushButton, QWidget) 
from PyQt5.QtGui import QIcon 

class Chat(QMainWindow): 
    def __init__(self): 
     super().__init__() 
     self.initUI() 

    def initUI(self): 
     self.populateUI() 

     self.resize(400, 400) 
     self.center() 
     self.setWindowTitle('Simple Chat') 
     self.show() 

    def center(self): 
     qr = self.frameGeometry() 
     cp = QDesktopWidget().availableGeometry().center() 
     qr.moveCenter(cp) 
     self.move(qr.topLeft()) 

    def populateUI(self): 
     self.createMenu() 
     self.statusBar() 
     centralWidget = CentralWidget() 
     self.setCentralWidget(centralWidget) 

    def createMenu(self): 
     menuBar = self.menuBar() 

     fileMenu = menuBar.addMenu('&File') 
     fileMenu.addAction(self.createExitAction()) 

     helpMenu = menuBar.addMenu('&Help') 
     helpMenu.addAction(self.createAboutAction()) 

    def createExitAction(self): 
     exitAction = QAction(QIcon('exit.png'), '&Exit', self) 
     exitAction.setShortcut('Ctrl+Q') 
     exitAction.setStatusTip('Exit application') 
     exitAction.triggered.connect(self.close) 
     return exitAction 

    def createAboutAction(self): 
     aboutAction = QAction(QIcon('info.png'), '&About', self) 
     aboutAction.setShortcut('Ctrl+H') 
     aboutAction.setStatusTip('Information about the program') 
     aboutAction.triggered.connect(self.createAboutDialog) 
     return aboutAction 

    def createAboutDialog(self): 
     dialog = QDialog(self) 
     dialog.setWindowTitle('About') 
     dialog.setWindowIcon(QIcon('info.png')) 
     dialog.resize(200, 200) 
     dialog.exec_() 

class CentralWidget(QWidget): 
    def __init__(self): 
     super().__init__() 
     self.initUI() 

    def initUI(self): 
     ribbon = QTextEdit() 
     chat = QTextEdit() 
     sendBtn = QPushButton('Send') 

     grid = QGridLayout() 
     grid.setSpacing(3) 
     grid.addWidget(ribbon, 0, 0, 1, 3) 
     grid.addWidget(chat, 1, 0, 1, 1) 
     grid.addWidget(sendBtn, 1, 2) 

     self.setLayout(grid) 

if __name__ == '__main__': 
    app = QApplication(sys.argv) 
    chat = Chat() 
    sys.exit(app.exec_()) 

Antwort

1

Sie müssen zuerst eine feste Höhe für die untere Textbearbeitung festlegen, basierend auf der Anzahl der Zeilen, die angezeigt werden sollen. Dies muss auch unter Berücksichtigung des Rahmens und Dokumentrand nehmen:

def initUI(self): 
     ... 
     chat.setFixedHeight(
      (chat.fontMetrics().lineSpacing() * 3) + 
      (chat.document().documentMargin() * 2) + 
      (chat.frameWidth() * 2) - 1 
      ) 

Sie müssen dann die Politik der Knopfgröße ändern, so dass es vertikal erweitert:

 policy = sendBtn.sizePolicy() 
     policy.setVerticalPolicy(QSizePolicy.MinimumExpanding) 
     sendBtn.setSizePolicy(policy) 

Schließlich müssen Sie festlegen die Dehnungsfaktoren in der ersten Zeile und Spalte, so dass die Textbearbeitungen den gesamten verfügbaren Platz einnehmen:

 grid.setRowStretch(0, 1) 
     grid.setColumnStretch(0, 1)