2016-06-30 4 views
1

Я изучал PyQt5, и recenlty решил сделать gui для простого чата. Это мой макет:Gui для простого общения в PyQt5 с помощью QGridLayout

PyQt5 simple chat GUI mockup

Я QGridLayout, и это то, что я получил:

PyQt5 simple chat GUI example

Как уменьшить размер нижней QTextEdit, поэтому она имеет 2- 3 доступных строки и увеличить QPushButton?

Моя программа:

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_()) 

ответ

1

Сначала вам нужно установить фиксированную высоту для нижнего текстового редактирования в зависимости от количества строк, которые вы хотите показать. Это также необходимо учитывать наценки кадров и документ:

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

Затем нужно изменить политику размера кнопки, так что она расширяется по вертикали:

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

Наконец, вам необходимо установить коэффициенты растяжения в первом ряду и колонке, так что текстовые изменения занимают все свободное пространство:

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