Как в qt создать графическое приложение
Начиная с этой статьи Мы приступаем к изучению графических библиотек Qt, а если быть точнее, QGraphicsScene. Данный класс предоставляет функционал по управлению большим количеством 2D объектов. QGraphicsScene устанавливается в QGraphicsView.
Опишем функционал, который необходимо будет реализовать в нашем приложении:
- Добавление графической сцены в QGraphicsView.
- Отрисовка двух объектов на графической сцене с помощью линий, а именно прямоугольника и квадрата.
- Динамическое изменение размеров графической сцены в зависимости от изменения размеров QGraphicsView.
- Динамическое изменение объектов на графической сцене в зависимости от размеров самой графической сцены.
Программный код был написан в QtCreator 3.3.1 на основе Qt 5.4.1.
Структура проекта для работы с QGraphicsScene
К структуре проекта "по умолчанию" добавляется ещё один класс MyGraphicView.
Дело в том, что для удобства работы с QGraphicsScene было принято решение создать класс, который наследуется от QGraphicsView и уже внутри него работать с графической сценой и её объектами.
mainwindow.ui
Внешний вид приложения представляет из себя главное окно и GridLayout, растянутый на всё это окно. По итогам урокам приложение будет выглядеть следующим образом:
mainwindow.h
Всё, что делаем в этом файле, это подключаем заголовочный файл MyGraphicsView.
mainwindow.cpp
Данный файл также ничем не примечателен. Инициализируем виджет и добавляем его GridLayout окна приложения.
mygraphicview.h
А теперь самое интересное. Работа непосредственно с графической сценой, в которой мы отрисуем два новых объекта, которые должны будут перерисоваться при изменении размера окна приложения, и соответственно самого виджета.
Для динамической перерисовки графической сцены, а также при создании главного окна, параметры ширины и высоты окна устанавливаются не сразу, а после полной отрисовки, поэтому для отрисовки содержимого виджета потребуется некоторая задержка по времени, чтобы получить правильные значения ширины и высоты виджета, в котором будет содержаться QGraphicsScene. Для этого воспользуемся классом QTimer , по переполнению которого будем вызывать СЛОТ, в котором уже будет происходить отрисовка содержимого графической сцены и корректировка её размеров.
mygraphicview.cpp
Для перерисовки объектов в QGraphicsScene эти самые объекты необходимо будет удалять, поэтому для удобства работы элементы этих объектов буду сгруппированы, а также будет написан метод для удаления всех элементов группы. Это удобно в том случае, если Вам необходимо перерисовать только один объект из нескольких, который состоит из ряда элементов.
Результат работы приложения продемонстрирован на следующем видео с момента 5:27. До этого момента в видео присутствуют пояснения проекта.
Ну что, друзья, вот мы и добрались до программирования стандартных графических приложений с помощью Qt5. На этом уроке мы попробуем создать наши первые программы, которые будут содержать такие графические элементы, как: кнопка, значок приложения, всплывающая подсказка, различные курсоры мыши, а также рассмотрим, как можно центрировать окно нашей программы и бегло коснемся вопроса работы механизма «сигнал-слот».
Простой пример
А начнем мы с простого примера, который отображает на экране стандартное окно:
// Каждое Qt5-приложение (за исключением консольных) должно включать следующую строку // Главный виджет, который представляет окно нашей программы window . resize ( 250 , 150 ) ; // изменяем размер виджета в пикселях window . setWindowTitle ( "Simple example" ) ; // устанавливаем заголовок для главного окна // С помощью метода exec() запускаем основной цикл нашей программыРезультат выполнения программы:
Всплывающая подсказка
Всплывающая подсказка — это небольшой всплывающий прямоугольник с некоторым текстом, который появляется, когда вы наводите курсор на какой-нибудь элемент в приложении. В нижеследующем примере мы создадим всплывающую подсказку для нашего основного окна:
window . setWindowTitle ( "ToolTip" ) ; // устанавливаем заголовок для окна window . setToolTip ( "QWidget" ) ; // устанавливаем всплывающую подсказку для виджетаРезультат выполнения программы:
Иконка для приложения
В следующем примере мы зададим иконку для приложения. Большинство оконных менеджеров отображают этот значок в левом углу заголовка и на панели задач.
Для отображения иконки мы используем метод setWindowIcon() и класс QIcon. Иконка представляет собой небольшой .jpg-файл, расположенный в текущем рабочем каталоге:
Результат выполнения программы:
Курсор
Курсор — это небольшой значок, отображающий на экране положение указателя мыши. В наших программах мы можем использовать различные виды курсоров. В следующем примере мы задействуем три фрейма, каждый из которых будет иметь свой курсор:
QFrame * frame1 = new QFrame ( this ) ; // создаем виджет frame1 -> setFrameStyle ( QFrame :: Box ) ; // устанавливаем рамки фрейма frame1 -> setCursor ( Qt :: SizeAllCursor ) ; // задаем тип курсора SizeAllCursor для фрейма QFrame * frame2 = new QFrame ( this ) ; // создаем виджет frame2 -> setFrameStyle ( QFrame :: Box ) ; // устанавливаем рамки фрейма frame2 -> setCursor ( Qt :: WaitCursor ) ; // задаем тип курсора WaitCursor для фрейма QFrame * frame3 = new QFrame ( this ) ; // создаем виджет frame3 -> setFrameStyle ( QFrame :: Box ) ; // устанавливаем рамки фрейма frame3 -> setCursor ( Qt :: PointingHandCursor ) ; // задаем тип курсора PointingHandCursor для фреймаРезультат выполнения программы:
Кнопка
В следующем примере мы добавим на нашу форму самую обычную кнопку. Нажатие на кнопку приведет к закрытию приложения. И здесь же впервые будут использованы понятия сигналов и слотов:
QPushButton * quitBtn = new QPushButton ( "Quit" , this ) ; // создаем новую кнопку quitBtn -> setGeometry ( 50 , 40 , 75 , 30 ) ; // изменяем размеры кнопки в пикселях и помещаем на форму окна connect ( quitBtn , &QPushButton :: clicked , qApp , &QApplication :: quit ) ;При нажатии на кнопку, генерируется сигнал clicked . Слот — это метод, который реагирует на сигнал. В нашем случае это будет слот quit основного объекта приложения. QApp — это глобальный указатель на объект приложения. Он определен в заголовочном файле QApplication.
connect ( quitBtn , &QPushButton :: clicked , qApp , &QApplication :: quit ) ;Результат выполнения программы:
Взаимодействие виджетов
Мы заканчиваем этот урок примером, который демонстрирует возможность виджетов взаимодействовать друг с другом. Код данного примера разделен на три файла.
Следующий код является заголовочным файлом, в котором мы определяем два слота и виджет lbl .
Заголовочный файл — plusminus.h:
Q_OBJECT // этот макрос должен включаться в классы, которые объявляют свои собственные сигналы и слотыУ нас есть две кнопки и виджет lbl . С помощью кнопок мы увеличиваем или уменьшаем число, отображаемое в lbl .
Файл реализации — plusminus.cpp:
connect ( plsBtn , &QPushButton :: clicked , this , &PlusMinus :: OnPlus ) ; connect ( minBtn , &QPushButton :: clicked , this , &PlusMinus :: OnMinus ) ;А здесь происходит соединение сигналов clicked с соответствующими слотами:
connect ( plsBtn , &QPushButton :: clicked , this , &PlusMinus :: OnPlus ) ; connect ( minBtn , &QPushButton :: clicked , this , &PlusMinus :: OnMinus ) ;В методе OnPlus() мы определяем текущее значение в lbl . Виджет lbl отображает строковое значение, поэтому сначала его нужно преобразовать в целое число. Затем мы это число увеличиваем, конвертируем получившееся число снова в строковое значение и устанавливаем новый текст для label :
int val = lbl -> text ( ) . toInt ( ) ; // выполняем конвертацию в тип int lbl -> setText ( QString :: number ( val ) ) ; // конвертируем обратно в Qstring и устанавливаем новый текст для labelМетод OnMinus() отличается от метода OnPlus() только тем, что в OnMinus() значение не инкрементируется, а декрементируется (уменьшается на единицу).
А это уже наш основной файл — main.cpp:
Результат выполнения программы:
Заключение
На этом уроке мы создали наши первые графические программы с помощью Qt5, а на следующем уроке мы рассмотрим подключение стандартных меню и панелей инструментов (тулбаров).
(51 оценок, среднее: 4,90 из 5)Урок №5. Работа с файлами и каталогами в Qt5
Комментариев: 29
Да. У картинки есть конструктор, принимающий Pixmap. Потом соединяем QPushButton::clicked и QApplication::quit и всё
Потому что виджет lbl мы используем в методах OnPlus/OnMinus, т.е. нам нужно иметь доступ к этому виджету. В то время как кнопки нам нужно только создать
Расскажите пожалуйста о методе move().
Дмитрий Бушуев :P.S.: Попробуйте поставить другие значения координат и посмотреть на результат 🙂
Добрый день!
Пытаюсь изучать с вашей помощью QT, за что Вам огромное спасибо!)
У меня возник такой вопрос) в программе есть такая штука как дизайнер, с помощью которой удобно создавать объекты на нашем окне приложения и сигналы со слотами)
Какие у этого способа минусы и каким способом лучше писать приложения?)
Как решили ситуацию?(У меня сейчас подобное происходит)
Дмитрий Бушуев : Дмитрий Бушуев :Нужно создавать проект типа "Приложение Qt Widgets".
QT+=core gui widgets
CONFIG += c++11
Пишет, что С++ требует type specifier for all declarations.
Дмитрий Бушуев :Проверил у себя. Всё работает.
Добрый день. Подскажите пожалуйста в примере с курсорами в конструкторе класса Cursors задается стандартное значение указателя parent = 0. Можно ли туда заместо 0 передавать nullPtr?
Дмитрий Бушуев : Дмитрий Бушуев :Т.е. в QT есть что-то типа garbage collector? А можно поподробнее, как он здесь работает?
Дмитрий Бушуев :Hello Notepad
В первом примере, мы создадим простое окно для редактирования текста. Это самая элементарная программа с графическим интерфейсом Qt.
Исходный код примера:
Рассмотрим подробно каждую строчку кода. В первых двух, мы подключаем заголовочные файлы классов QApplication и QTextEdit, которые необходимы для работы этого примера. Каждому классу в Qt соответствует заголовочный файл с таким же названием.
В строке 6 создается объект класса QApplication, который управляет основными ресурсами, необходимыми для запуска любой программы с графическим интерфейсом Qt. Ему необходимо передать аргументы argv и args функции main() , т.к. Qt использует некоторые параметры командной строки, передаваемые при запуске программы.
В восьмой строке кода создается объект класса QTextEdit. QTextEdit — это визуальный элемент графического интерфейса. В Qt используются определенные виджеты — например, полосы прокрутки, метки и кнопки radio. Виджет может быть контейнером для хранения других виджетов. Наглядным примером является главное диалоговое окно программы.
В строке 9, окно редактирования текста выводится на экран в главном фрейме программы. Поскольку виджеты могут работать как контейнеры (В экземпляре класса QMainWindow находятся полосы панели инструментов, меню, строка состояния и несколько других виджетов), мы может отобразить только один виджет в окне нашей программы. По умолчанию, виджеты не видны. Функция show() используется для их отображения.
В строке 11, создается объект QApplication, который генерирует цикл событий в процессе работы приложения. События генерируются и передаются на обработку виджетам. Примерами событий могут являться клики мыши, нажатия клавиш на клавиатуре и т.п. Когда вы вводите текст в окне редактирования виджета QTextEdit, нажатия клавиш обрабатываются средствами виджета, и вводимый текст отображается в процессе набора.
Для запуска программы, откройте командную строку и зайдите в директорию с .cpp файлом программы. Выполните следующие команды shell-интерпретатора, чтобы скомпилировать пример.
После успешного выполнения предыдущих команд, скомпилированная программа будет размещена в директории текущего проекта (в Windows вы можете использовать nmake вместо make . Исполняемые файлы будут размещены в директориях debug или release, которые создадутся командой make . qmake — это утилита, которая создает файлы конфигурации Qt-проекта, если ей передан аргумент -project . После создания файла конфигурации (.pro), qmake генерирует Makefile, который используется утилитой make для сборки приложения. Позже, мы рассмотрим процесс написания собственных .pro файлов.
Добавления кнопки выхода
В реальных проектах, обычно используется более одного виджета. Сегодня мы добавим кнопку QPushButton под полем редактирования текста. При клике на нее, программа будет завершаться.
Рассмотрим исходный код программы.
Сначала подключается заголовочный файл QtGui. В нем содержатся все классы графического интерфейса Qt.
В строке 10 применяется механизм сигналов и слотов, для того, чтобы закрыть программу после нажатия на кнопку выхода. Слот — это функция, которая может быть вызвана в процессе выполнения программы. Сигнал — функция, вызывающая функции-слоты, которые с ним посредством QObject::connect.
quit() — слот класса QApplication, завершающий работу приложения. clicked() — сигнал, который передает нажатая кнопка QPushButton. Статическая функция QObject::connect связывает определенный слот и сигнал. SIGNAL() и SLOT() — макросы, которые принимают сигнатуры сигналов и слотов, для их связи между собой. Также, функции connect() необходимо передать указатели на объекты, которые будут принимать и рассылать сигналы.
В строке 12 создается объект класса QVBoxLayout. Как уже было сказано, виджеты могут содержать в себе другие виджеты. Можно задавать координаты и размер вложенных виджетов непосредственно, но обычно для этого используют слои (layouts). Слой управляет границами вложенных виджетов. Например, объект QVBoxLayout размещает виджеты в одну вертикальную колонку.
В строках 13 и 14, мы добавляем поле редактирования текста и кнопку выхода к слою layout . В строке 17 задается главный слой для всего приложения.
Наследование QWidget
Когда пользователь хочет закрыть приложение, ему можно показать всплывающее окно, в котором программа спросит подтверждение данного действия. В этом примере мы создадим наследник QWidget и добавим в него слот, который будет привязан к кнопке выхода.
Рассмотрим следующий код.
Макрос Q_OBJECT объявляет наш класс как QObject. Он должен находиться в самом начале определения класса. QObject добавляет несколько расширенных возможностей к обычному классу C++. Например, имена классов и слотов можно запросить в процессе выполнения. Также, мы можем узнать типы параметров слота и вызвать его.
В строке 13 объявляется слот quit() . В последствии, мы присоединим этот слот к сигналу.
В предыдущих примерах, создание графики и присоединение слотов осуществлялось внутри функции main() . Сейчас мы будем использовать конструктор Notepad.
Как видно из определения класса, мы используем указатели на объекты textEdit и quitButton . Для объектов QObject, почти всегда рациональнее выделять память в куче, вместо их копирования.
Мы используем функцию tr() для обработки всех строк, которые видны пользователю. Эта функция применяется, когда приложение нужно перевести на несколько языков. Здесь мы не будем углубляться в детали, но вы можете найти нужную информацию в описании библиотеки Qt Linguist.
Создание файлов .pro
Ранее, мы использовали команду qmake -project для создания файлов .pro. В следующем примере, мы создадим этот файл вручную.
Теперь для сборки программ на Qt, будут использоваться следующие команды.
Использование QMainWindow
Во многих приложениях удобно использовать QMainWindow — слой, в который можно добавлять контекстные меню, встроенные виджеты, панели инструментов и строку состояния. В QMainWindow есть центральная область, куда можно добавлять любые дочерние виджеты. В этом примере мы разместим там поле для редактирования текста.
Рассмотрим определение класса Notepad .
Мы создали два дополнительных слота — open() и save() . Они будут открывать и сохранять документ. Пример их реализации будет представлен позже.
Очень часто, один и тот же слот используется одновременно несколькими виджетами. Например, в пунктах меню и соответственных кнопках на панели инструментов. Чтобы упростить этот процесс, в Qt существует класс QAction, который можно передавать сразу нескольким виджетам и присоединять к слоту. Например, QMenu и QToolBar могут создавать пункты меню, используя одно действие QAction. Скоро вы убедитесь, как это облегчает процессе разработки.
Сначала, мы используем конструктор класса Notepad для создания графического интерфейса программы.
При создании действий, задается текст, отображаемый внутри виджетов, в которые будут добавлены эти действия (в нашем случае, пункты меню). Если нам нужно добавить кнопки для этих действий в панель инструментов, мы можем передать иконку для каждого действия.
Когда пользователь кликает на пункте меню, рассылается сигнал действия и вызывается соответствующий слот.
Сохранение и открытие
В этом примере, мы реализуем функционал слотов open() и save() , которые были добавлены в предыдущем примере.
Первый шаг — это запрос у пользователя имени файла для открытия. В состав Qt входит класс QFileDialog — диалоговое окно, в котором пользователь может выбрать файл. Статическая функция getOpenFileName() открывает модальное окно для выбора файла и возвращает путь к выбранном файлу. Если пользователь отменил действие, функция возвращает пустую строку.
Чтение данных становится тривиальной задачей, благодаря классу QTextStream — оберткой над объектом QFile. Функция readAll() возвращает содержимое файла, как объект QString. Это содержимое мы поместим в поле для редактирования текста. Затем, мы закрываем файл с помощью функции close(), чтобы вернуть файловый дескриптор операционной системе.
Перейдем к реализации слота save() .
Для сохранения данных мы снова используем класс QTextStream. При помощи него, можно записывать строки QString в файл, используя оператор << .
Эта статья предназначена для тех, кто только начинает своё знакомство с созданием приложений с графическим интерфейсом (GUI) на Python. В ней мы рассмотрим основы использования PyQt в связке с Qt Designer. Шаг за шагом мы создадим простое Python GUI приложение, которое будет отображать содержимое выбранной директории.
Что нам потребуется
Нам понадобятся PyQt и Qt Designer, ну и Python, само собой.
В этой статье используется PyQt5 с Python 3, но особых различий между PyQt и PySide или их версиями для Python 2 нет.
Windows: PyQt можно скачать здесь. В комплекте с ним идёт Qt Designer.
macOS: Вы можете установить PyQt с помощью Homebrew:
$ brew install pyqt5
Linux: Всё нужное, вероятно, есть в репозиториях вашего дистрибутива. Qt Designer можно установить из Центра Приложений, но PyQt придётся устанавливать через терминал. Установить всё, что нам понадобится, одной командой можно, например, так:
После того как вы закончили с приготовлениями, откройте командную строку/терминал и убедитесь, что вы можете использовать команду pyuic5 . Вы должны увидеть следующее:
Если вы используете Windows, то, скорее всего, путь C:\Python36\Scripts (измените 36 на вашу версию Python) не прописан в вашем PATH . Загляните в этот тред на Stack Overflow, чтобы узнать, как решить проблему.
Дизайн
Основы
Теперь, когда у нас всё готово к работе, давайте начнём с простого дизайна.
17–19 декабря, Онлайн, Беcплатно
Откройте Qt Designer, где вы увидите диалог новой формы, выберите Main Window и нажмите Create.
После этого у вас должна появиться форма — шаблон для окна, размер которого можно менять и куда можно вставлять объекты из окна виджетов и т.д. Ознакомьтесь с интерфейсом, он довольно простой.
Теперь давайте немного изменим размер нашего главного окна, т.к. нам не нужно, чтобы оно было таким большим. А ещё давайте уберём автоматически добавленное меню и строку состояния, поскольку в нашем приложении они не пригодятся.
Все элементы формы и их иерархия по умолчанию отображаются в правой части окна Qt Designer под названием Object Inspector. Вы с лёгкостью можете удалять объекты, кликая по ним правой кнопкой мыши в этом окне. Или же вы можете выбрать их в основной форме и нажать клавишу DEL на клавиатуре.
В итоге мы имеем почти пустую форму. Единственный оставшийся объект — centralwidget , но он нам понадобится, поэтому с ним мы ничего не будем делать.
Теперь перетащите куда-нибудь в основную форму List Widget (не List View) и Push Button из Widget Box.
Макеты
Вместо использования фиксированных позиций и размеров элементов в приложении лучше использовать макеты. Фиксированные позиции и размеры у вас будут выглядеть хорошо (пока вы не измените размер окна), но вы никогда не можете быть уверены, что всё будет точно так же на других машинах и/или операционных системах.
Макеты представляют собой контейнеры для виджетов, которые будут удерживать их на определённой позиции относительно других элементов. Поэтому при изменении размера окна размер виджетов тоже будет меняться.
Давайте создадим нашу первую форму без использования макетов. Перетащите список и кнопку в форме и измените их размер, чтобы вышло вот так:
Теперь в меню Qt Designer нажмите Form, затем выберите Preview и увидите что-то похожее на скриншот выше. Выглядит хорошо, не так ли? Но вот что случится, когда мы изменим размер окна:
Наши объекты остались на тех же местах и сохранили свои размеры, несмотря на то что размер основного окна изменился и кнопку почти не видно. Вот поэтому в большинстве случаев стоит использовать макеты. Конечно, бывают случаи, когда вам, например, нужна фиксированная или минимальная/максимальная ширина объекта. Но вообще при разработке приложения лучше использовать макеты.
Основное окно уже поддерживает макеты, поэтому нам ничего не нужно добавлять в нашу форму. Просто кликните правой кнопкой мыши по Main Window в Object Inspector и выберите Lay out → Lay out vertically. Также вы можете кликнуть правой кнопкой по пустой области в форме и выбрать те же опции:
Ваши элементы должны быть в том же порядке, что и до внесённых изменений, но если это не так, то просто перетащите их на нужное место.
Так как мы использовали вертикальное размещение, все элементы, которые мы добавим, будут располагаться вертикально. Можно комбинировать размещения для получения желаемого результата. Например, горизонтальное размещение двух кнопок в вертикальном будет выглядеть так:
Если у вас не получается переместить элемент в главном окне, вы можете сделать это в окне Object Inspector.
Последние штрихи
Теперь, благодаря вертикальному размещению, наши элементы выровнены правильно. Единственное, что осталось сделать (но не обязательно), — изменить имя элементов и их текст.
В простом приложении вроде этого с одним лишь списком и кнопкой изменение имён не обязательно, так как им в любом случае просто пользоваться. Тем не менее правильное именование элементов — то, к чему стоит привыкать с самого начала.
Свойства элементов можно изменить в разделе Property Editor.
Подсказка: вы можете менять размер, передвигать или добавлять часто используемые элементы в интерфейс Qt Designer для ускорения рабочего процесса. Вы можете добавлять скрытые/закрытые части интерфейса через пункт меню View.
Нажмите на кнопку, которую вы добавили в форму. Теперь в Property Editor вы должны видеть все свойства этого элемента. В данный момент нас интересуют objectName и text в разделе QAbstractButton . Вы можете сворачивать разделы в Property Editor нажатием по названию раздела.
Измените значение objectName на btnBrowse и text на Выберите папку.
Должно получиться так:
Именем объекта списка является listWidget , что вполне подходит в данном случае.
Сохраните дизайн как design.ui в папке проекта.
Превращаем дизайн в код
Конечно, можно использовать .ui -файлы напрямую из Python-кода, однако есть и другой путь, который может показаться легче. Можно конвертировать код .ui -файла в Python-файл, который мы потом сможем импортировать и использовать. Для этого мы используем команду pyuic5 из терминала/командной строки.
Чтобы конвертировать .ui -файл в Python-файл с названием design.py , используйте следующую команду:
Пишем код
Теперь у нас есть файл design.py с нужной частью дизайна нашего приложения и мы начинать работу над созданием его логики.
Создайте файл main.py в папке, где находится design.py .
Используем дизайн
Для Python GUI приложения понадобятся следующие модули:
Также нам нужен код дизайна, который мы создали ранее, поэтому его мы тоже импортируем:
Так как файл с дизайном будет полностью перезаписываться каждый раз при изменении дизайна, мы не будем изменять его. Вместо этого мы создадим новый класс ExampleApp , который объединим с кодом дизайна для использования всех его функций:
В этом классе мы будем взаимодействовать с элементами интерфейса, добавлять соединения и всё остальное, что нам потребуется. Но для начала нам нужно инициализировать класс при запуске кода. С этим мы разберёмся в функции main() :
И чтобы выполнить эту функцию, мы воспользуемся привычной конструкцией:
В итоге main.py выглядит таким образом:
Если запустить этот код: $ python3 main.py , то наше приложение запустится!
Но нажатие на кнопку ничего не даёт, поэтому нам придётся с этим разобраться.
Добавляем функциональность в наше Python GUI приложение
Примечание Весь дальнейший код пишется внутри класса ExampleApp .
Начнём с кнопки Выберите папку. Привязать к функции событие вроде нажатия на кнопку можно следующим образом:
Добавьте эту строку в метод __init__ класса ExampleApp , чтобы выполнить привязку при запуске приложения. А теперь взглянем на неё поближе:
- self.btnBrowse : здесь btnBrowse — имя объекта, который мы определили в Qt Designer. self говорит само за себя и означает принадлежность к текущему классу;
- clicked — событие, которое мы хотим привязать. У разных элементов разные события, например, у виджетов списка есть itemSelectionChanged и т.д.;
- connect() — метод, который привязывает событие к вызову переданной функции;
- self.browse_folder — просто функция (метод), которую мы описали в классе ExampleApp .
Для открытия диалога выбора папки мы можем использовать встроенный метод QtWidgets.QFileDialog.getExistingDirectory :
Если пользователь выберет директорию, переменной directory присвоится абсолютный путь к выбранной директории, в противном случае она будет равна None . Чтобы не выполнять код дальше, если пользователь закроет диалог, мы используем команду if directory: .
Для отображения содержимого директории нам нужно импортировать os :
И получить список содержимого следующим образом:
Для добавления элементов в listWidget мы используем метод addItem() , а для удаления всех элементов у нас есть self.listWidget.clear() .
В итоге функция browse_folder должна выглядеть так:
Теперь, если запустить приложение, нажать на кнопку и выбрать директорию, мы увидим:
Так выглядит весь код нашего Python GUI приложения:
Это были основы использования Qt Designer и PyQt для разработки Python GUI приложения. Теперь вы можете спокойно изменять дизайн приложения и использовать команду pyuic5 без страха потерять написанный код.
Читайте также: