Как в приложении PyQt оформить код, чтобы каждый объект был в своем классе и располагались все на форме?

Рейтинг: 1Ответов: 1Опубликовано: 16.08.2023
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QFont
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWidgets import QWidget
from PyQt5.QtWidgets import QMainWindow
from PyQt5.QtWidgets import QTableWidget
from PyQt5.QtWidgets import QTextEdit, QHBoxLayout, QPushButton, QVBoxLayout
import sys

CONST_WIN_SIZE_MAIN_W = 1600
CONST_WIN_SIZE_MAIN_H = 860
LEFT_INDENT_TABW = 10
TOP_INDENT_TABW = 70
WIDTH_TABW = 1580
HEIGHT_TABW = 680
TOP_LOGTEXT = 750
HEIGHT_LOGTEXT = 100

class WinUpdateSql(QMainWindow):
    '''Базовый класс. Создается общее окно'''
    def __init__(self):
        super(WinUpdateSql, self).__init__()
        self.setWindowTitle('Редактор базы данных')
        self.setStyleSheet("background-color: #e1e5e5;")
        self.setWindowFlags(Qt.WindowCloseButtonHint)
        self.resize(CONST_WIN_SIZE_MAIN_W, CONST_WIN_SIZE_MAIN_H)


class TableWidget(QTableWidget):
    def __init__(self, parent=None):
        super(TableWidget, self).__init__(parent)
        self.t_widg = QTableWidget(self)
        self.t_widg.setGeometry(LEFT_INDENT_TABW,
                                TOP_INDENT_TABW,
                                WIDTH_TABW,
                                HEIGHT_TABW)


class LogsTextEdit(QTextEdit):
    def __init__(self, parent=None):
        super(LogsTextEdit, self).__init__(parent)
        self.logTextBox = QTextEdit(self)
        self.logTextBox.setGeometry(LEFT_INDENT_TABW,
                                    TOP_LOGTEXT,
                                    WIDTH_TABW,
                                    HEIGHT_LOGTEXT)
        self.logTextBox.setStyleSheet("border-radius: 4px; border: 1px solid")
        self.logTextBox.setFont(QFont('Arial', 10))
        self.logTextBox.setReadOnly(True)

Не получается корректно поместить на одну форму с использованием self.setCentralWidget, QHBoxLayout, QVBoxLayout?
Еще дополнительно будут добавлены кнопки, текстовые поля

Примерно что-то такое хотелось получить

Ответы

▲ 0Принят

Примерно так:

import sys
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QFont, QCursor
from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow,\
    QTableWidget, QTextEdit, QHBoxLayout, QPushButton, QVBoxLayout, \
    QHeaderView


CONST_WIN_SIZE_MAIN_W = 1300
CONST_WIN_SIZE_MAIN_H = 660
LEFT_INDENT_TABW = 10
TOP_INDENT_TABW = 70
WIDTH_TABW = 1580
HEIGHT_TABW = 680
TOP_LOGTEXT = 750
HEIGHT_LOGTEXT = 100

        
class TableWidget(QTableWidget):
    def __init__(self, parent=None):
        super(TableWidget, self).__init__(parent)

        self.setRowCount(20)     
        self.setColumnCount(6)

        self.setHorizontalHeaderLabels(list('ABCDEF'))
        self.verticalHeader().setDefaultSectionSize(40)
        self.horizontalHeader().setDefaultSectionSize(200)
        self.horizontalHeader().setSectionResizeMode(0, QHeaderView.ResizeToContents)
        self.horizontalHeader().setSectionResizeMode(5, QHeaderView.Stretch)

# ???        self.t_widg = QTableWidget(self)
# ???        self.t_widg.setGeometry(LEFT_INDENT_TABW, TOP_INDENT_TABW,
# ???            WIDTH_TABW, HEIGHT_TABW)
        

        
class LogsTextEdit(QTextEdit):
    def __init__(self, parent=None):
        super(LogsTextEdit, self).__init__(parent)
        
# ???        self.logTextBox = QTextEdit(self)
# ???        self.logTextBox.setGeometry(LEFT_INDENT_TABW, TOP_LOGTEXT,
# ???            WIDTH_TABW, HEIGHT_LOGTEXT)
            
        self.setText('''Как в PyQt по красоте оформить код,\
чтобы каждый объект был в своем классе,\
и располагались все на форме?''')
       
        self.setStyleSheet("border-radius: 4px; border: 4px solid #800000;")
        self.setFont(QFont('Arial', 25))
        self.setReadOnly(True)
        

class PushButton(QPushButton):
    def __init__(self, *args, **kwargs):
        super(PushButton, self).__init__(*args, **kwargs)
#        self.setMinimumSize(100, 40)        
        self.setCursor(QCursor(Qt.CursorShape.PointingHandCursor))
        self.setStyleSheet("""
            *{border: 4px solid 'green';
            border-radius: 20px;
            font-size: 25px;
            color: 'Indigo';
            background: #ADFF2F;
            padding: 12px 0;
            margin: 10px, 10px;}
            *:hover{background: 'green'; color: 'white';}
            *:pressed{background: 'lightgreen'}       
        """)
        

class MainWindow(QMainWindow):
    '''Базовый класс. Создается общее окно'''
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setWindowTitle('Редактор базы данных')
        self.setStyleSheet("background-color: #f1e5f5;")
# ?        self.setWindowFlags(Qt.WindowCloseButtonHint)
        self.resize(CONST_WIN_SIZE_MAIN_W, CONST_WIN_SIZE_MAIN_H)
        
        self.centralwidget = QWidget()
        self.centralwidget.setObjectName("centralwidget")
        self.setCentralWidget(self.centralwidget)
        
        self.button_1 = PushButton(self, text='button1')
        self.button_2 = PushButton(self, text='button2')
        self.button_3 = PushButton(self, text='button3')
        
        self.layout_h = QHBoxLayout()
        self.layout_h.addWidget(self.button_1)
        self.layout_h.addWidget(self.button_2)
        self.layout_h.addWidget(self.button_3)
        
        self.logsTextEdit = LogsTextEdit(self)
        self.tableWidget = TableWidget(self)
        
        self.layout = QVBoxLayout(self.centralwidget)
        self.layout.addLayout(self.layout_h)
        self.layout.addWidget(self.tableWidget, 2)
        self.layout.addWidget(self.logsTextEdit, 1)
        
        
if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec())

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