• Как установить отношения между родительским и дочерним окном в Python QT?

    chuikoalex
    @chuikoalex
    Викторович
    Давай по задачам:
    1. "открывается только одно дочернее окно" - я бы рекомендовал наследоваться не от QMainWindow, а от QDialog:
    class Dialog(QtWidgets.QDialog, untitled2.Ui_Dialog):

    тогда открытое окно будет блокировать родительское и ты спокойно можешь в нем работать (но если вдруг предусматривается работа в двух окнах сразу, то тогда - зачем вообще второе диалоговое окно?! делай две области в родительском и работай там)

    2. "дочерней передается переменная" - у класса Dialog, в методе _init передай эту переменную:
    def __init__(self, parent, connect_sql): 
        self.connect_sql = connect_sql

    и всё, дальше с ней работаешь.

    3. "из дочки были доступны свойства виджетов родителя" - для этого ты и передаешь в классе Dialog, в методе _init аргумент parent (= two.Dialog(self) - вот этот self это и есть ссылка на родителя) только не забудь:
    def __init__(self, parent, connect_sql): 
        self.parent = parent
        self.connect_sql = connect_sql

    и тогда ты сможешь обратиться к объекту родителя
    self.parent.label.setText("информация передана из дочернего окна")
    (предполагается конечно что у родителя есть объект label = QLable)

    НО такая взаимосвязь в корне ошибочна! (читать если скучно... :))
    spoiler
    Пока программа маленькая ок, но как только все разрастется ты умрешь отслеживать, что от кого куда передалось и главное почему! При разработке больших приложений нужно использовать определенные паттерны в построении взаимосвязей. Model-View-Controller (MVC) - если коротко когда ты делишь все приложение на три логических объекта Модель (она занимается всеми расчетами и переработками данных), Интерфейс (View - в данном случае это библиотека QT) он получает сигналы и данные от пользователя и передает их в Модель. И Controller, который связывает Модель и Интерфейс. Причем в идеале Модель вообще ни чего не знает от двух других и просто сообщает об изменении своего состояния и готовности обработанных данных, а Контролер который подписан на Модель (паттерн Наблюдатель) следит за этими изменениями и реагирует когда нужно.


    И последний совет при создании файлов интерфейсов (дизайнов) untitled всем объектам давай понятные имена, чтобы потом читая код было ясно для чего этот элемент используется.
    self.button_open_dialog.clicked.connect(self.browse) - ну хотя бы как-то так (а в идеале что именно за диалог)
    Ответ написан
    Комментировать
  • Как перехватить введенную букву в QTextEdit?

    chuikoalex
    @chuikoalex
    Викторович
    У QTextEdit есть сигнал textChanget, который генерится при изменении текста в текстовом поле. Настройся на него и бери последнюю букву текста, обрати внимание сигнал работает не только при появлении новых символов, но и при их удалении (любое "изменение" в текстовом поле).
    Ответ написан
  • Как сделать, чтобы дочерняя форма помнила свое состояние при повторном открытие?

    chuikoalex
    @chuikoalex
    Викторович
    Ну если понудеть, то сразу вопрос какие аргументы у состояния? Размер, положение, текст по умолчанию в LineEdit.
    1. Простой выход: создай словарь "состояний", в котором по ключу - названию диалогового окна, можно будет хранить данные о его состоянии (этот вариант если программа простая, и хранить состояние нужно только на время работы приложения).
    2. Если программа большая, то Евгений говорит правильно создай класс который наследуется от QDialog и при создании его экземпляров (диалоговых окон) каждое из них будет хранить состояние в себе (тоже только на время работы приложения ибо при перезапуске состояния будут дефолтными).
    3. Если прям нужно для сохранения перезапуска, то тут будет правильным создать конфигурационный файл .ini .yaml - кто что любит :)) Ну или словарь из п.1. можно просто сохранить с помощью модуля pickle.
    Ответ написан
    Комментировать
  • Как получить список из словаря по ключу из JSON файла?

    chuikoalex
    @chuikoalex
    Викторович
    templates = json.load(f) когда это строка выполнилась, то templates стал словарем полученным из файла (ну если упростить).
    ListLenght = len(section[select]) у тебя же section это ключ ("key1", "key2"...), который ты достал из из templates, с помощью метода .items() а ты пытаешь работать с ним как со словарем.
    Вместо:
    for section, commands in templates.items():
            ListLenght = len(section[select])
            print("В данном разделе ",ListLenght,"значений")

    просто:
    print("В данном разделе ", len(templates[select]), "значений")
    Ответ написан
    Комментировать
  • Как получить размер главного окна PyQt5?

    chuikoalex
    @chuikoalex
    Викторович
    "Резиновые" виджеты в PyQT делаются с помощью абсолютного позиционирования, для этого используются QHBoxLayout() и QVBoxLayout() (горизонтальная и вертикальная разметка / лояуты). Если в них закинуть виджет то он автоматически будет соблюдать размеры родительского виджета которому принадлежит BoxLayout.
    Вот именно про них стоит почитать в документации.
    И для создания UI лучше использовать QT Designer, там довольно удобно включать BoxLayout-ы у родительского виджета.
    Ответ написан
    Комментировать
  • Как запустить данный код на PyQt5?

    chuikoalex
    @chuikoalex
    Викторович
    Немного странная куча кода, учитывая, что class Ui_Form(QMainWindow): - это похоже на конвертированное детище qt designer. И такие файлы принято импортировать в свою программу. Но чтобы как-то запустить этот код необходимо добавить свой класс окна и в нем уже вызывать отрисовку дизайна.
    Короче после import menu_rc (чем бы оно не было )) нужно добавить и немного изменить:

    class MyWidget(Ui_Form):
        def __init__(self):
            super().__init__()
            self.setupUi(self)
    
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        ex = MyWidget()
        ex.show()
        sys.exit(app.exec_())
    Ответ написан
    Комментировать