Как сделать кнопку в qt creator

Обновлено: 05.07.2024

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 в файл, используя оператор .

Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
ui->setupUi(this);
this-> resize (800,600); // Устанавливаем размер главного окна
button = new QPushButton ("Love", this); // Создать кнопку
button->setGeometry((this->width()-300)/2,(this->height()-300)/2,300,300);
// В соответствии с окном устанавливаем положение кнопки
button_style (); // Устанавливаем стиль кнопки
>

void Widget::button_style()
QFile file (": / new / prefix1 / button.qss"); // Создание файлового объекта по пути к файлу
file.open (QFile :: ReadOnly); // Метод открытия файла
QString str = file.readAll (); // Получить все символы в qss
this-> setStyleSheet (str); // Устанавливаем таблицу стилей
>

Область настройки таблицы стилей*
QPushButton font-size: 100px; // Размер текста
color: yellow; // Цвет переднего плана - это цвет шрифта
border-radius: 150px; // размер скругленного угла, поскольку половина прямоугольника равна 150, поэтому размер скругленного угла установлен на 150, он станет прототипом, менее 150 - это скругленные углы Прямоугольник сейчас.
background-color: rgba (0,255,0,200); // Установить зеленый фон кнопки
>

QPushButton: hover font-size:100px;
color:green;
border-radius:150px;
background-color: rgba (255,255,0,200); // Устанавливаем фон кнопки желтый = красный + зеленый
>
QPushButton: loaded color:orange;
border-width:3;
border-color:orange;
border-style:solid;;
background-color: cyan; // Устанавливаем голубой фон для кнопки
>

Вы также можете установить таблицу стилей непосредственно под объектом QPushButton с помощью функции setStyleSheet (), но для нескольких состояний компонента это несколько неприменимо.Этот метод загрузки файла очень хорош!

В статье я расскажу как быстро и легко накидать интерфейс в Qt Designer, а также, как использовать при этом свои собственные виджеты.

Содержание:

Снимок окна программы, которая получилась при написании статьи приведен на рис. 1.

рис. 1 пример окна, созданного в Qt Designer

рис. 1 пример окна, созданного в Qt Designer

В нижней части рисунка находится счетчик, значение которого увеличивается с заданной периодичностью. Счетчик можно запустить или остановить при помощи соответствующих кнопок.

Раньше я никогда дизайнером не пользовался, т.к. думал, что он недостаточно гибок (это верно, отчасти), и позволяет использовать лишь стандартные элементы управления. Однако, недавно выполнял несколько заказов, в которых требовалось наклепать бешено много окошек, кнопочек и т.п. (все элементы управления были стандартными), поэтому я решил использовать Qt Designer. Я остался очень доволен дизайнером, но решил попробовать использовать в нем кастомные виджеты (есть несколько способов добиться такого результата, я расскажу лишь про один из них), и написать про это статью :).

1 Виджет счетчика

Наш счетчик отображает какое-либо значение в двоичном виде, при этом единице соответствует кружок красного цвета, а нулю — белого. Счетчик обладает разрядностью и периодичностью, с которой будет увеличиваться хранимое значение.

На листинг 1 приведен исходный код файла заголовка счетчика.

На листинг 1 все достаточно просто, я отмечу лишь один момент. Мы вынужденно написали метод set, для установки параметров счетчика, хотя, очевидно, что такую настройку можно было внести в конструктор. Дело в том, что конструктор классов, которые мы собираемся использовать в Qt Designer должны принимать лишь указатель на QWidget.

Реализация методов класса Counter дана на листинг 2, при этом, стоит отметить, что при создании таймера, в качестве родительского элемента передается 0, а не this (6 строка) — это, также, связано с тем, что наш счетчик будет использоваться Qt Designer-ом (он не должен содержать дочерних элементов). В связи с этим, деструктор счетчика должен освобождать из под таймера память (автоматическая сборка мусора не сработает).

Теперь у нас есть счетчик, который мы встроим в форму, созданную Qt Designer.

2 Qt Designer

Процесс создания формы очень прост — мы создаем чистую форму (при этом, даем ей имя), перетаскиваем на нее 2 кнопки и QWidget, устанавливаем их на нужных нам позициях, устанавливаем размеры и, главное, имена (objectName).

Если мы назовем форму MainUI — то будет автоматически создан файл с именем ui_mainui.h, содержащий класс MainUI. В свою очередь, класс будет содержать поля, имена которых совпадают с заданными в Qt Designer oojectName.

рис. 2 окно преобразования виджета

рис. 2 окно преобразования виджета

Теперь у нас есть форма, содержащая нужный нам интерфейс, остается только использовать ее…

3 Использование формы, созданной в Qt Designer

Я дал своей форме имя MainUI, виджету — имя m_counter, а кнопка — m_start и m_stop, соответственно. При этом, рядом с файлом проекта появился файл ui_mainui.h, в пространстве имен Ui которого расположен класс MainUI. Есть 2 варианта использовать этот класс:

  • наследование. При этом, должно использоваться множественное наследование (например, от классов QWidget и Ui::MainUI). Наследование от Ui::MainUI должно быть закрытым для решения проблемы ромбовидного наследования;
  • агрегация. Класс агрегат хранит указатель на форму, созданную в QtDesigner. Мне этот вариант кажется более естественным, хотя, обращаться к элементам формы приходится через указатель (в отличии от варианта с наследованием).

Файл заголовка формы, используемой в программе приведен на листинг 3, реализация — на листинг 4.

В 6 строке реализации форма, созданная дизайнером устанавливается для текущего диалога (this) при помощи метода setupUI.

Таким образом, практически одной мышью можно создать пользовательский интерфейс и использовать при этом нестандартные виджеты. Однако, при описании класса Counter отмечены особенности создания виджетов, используемых в Qt Designer (такой виджет не может содержать дочерних элементов, а его конструктор принимает единственный аргумент — указатель на родительский диалог).

брат, мне очень необходимо в данный момент. Я хочу , чтобы мои connvert C + + программ в Qt. Меня необходимо кнопку источника.

No such signal qpushbutton::clicked () in .

Но программа откроится

Это не важно брат, я сам сделал кнопка, который будет закрыт программу.Во так.

Ты толко скажи мне, как я могу удалить эти :


Нет, это важно. С таким подходом, как у тебя, хорошим программистом ты не станешь. Вернись к азам и разберись с ними.

Читайте также: