Как сделать убегающую кнопку в qt

Обновлено: 08.07.2024

Я хотел бы создать вертикальную кнопку в Qt (используя C ++, а не Python), с текстом, повернутым на 90º по часовой стрелке или против часовой стрелки. Это кажется невозможным со стандартным QPushButton.

Как я мог это сделать?

Решение

Чтобы создать вертикальную кнопку в Qt, вы можете создать подкласс QPushButton чтобы размеры, сообщаемые виджетом, были транспонированы, а также измените событие рисования, чтобы нарисовать кнопку с правильным выравниванием.

Вот класс называется OrientablePushButton которые могут быть использованы в качестве замены традиционного QPushButton но также поддерживает вертикальную ориентацию за счет использования setOrientation ,

Простой пример

А начнем мы с простого примера, который отображает на экране стандартное окно:

Результат выполнения программы:



Всплывающая подсказка

Всплывающая подсказка — это небольшой всплывающий прямоугольник с некоторым текстом, который появляется, когда вы наводите курсор на какой-нибудь элемент в приложении. В нижеследующем примере мы создадим всплывающую подсказку для нашего основного окна:

Результат выполнения программы:



Иконка для приложения

В следующем примере мы зададим иконку для приложения. Большинство оконных менеджеров отображают этот значок в левом углу заголовка и на панели задач.

Для отображения иконки мы используем метод setWindowIcon() и класс QIcon. Иконка представляет собой небольшой .jpg-файл, расположенный в текущем рабочем каталоге:

Результат выполнения программы:



Курсор

Курсор — это небольшой значок, отображающий на экране положение указателя мыши. В наших программах мы можем использовать различные виды курсоров. В следующем примере мы задействуем три фрейма, каждый из которых будет иметь свой курсор:

frame3 -> setCursor ( Qt :: PointingHandCursor ) ; // задаем тип курсора PointingHandCursor для фрейма

Результат выполнения программы:



Кнопка

В следующем примере мы добавим на нашу форму самую обычную кнопку. Нажатие на кнопку приведет к закрытию приложения. И здесь же впервые будут использованы понятия сигналов и слотов:

quitBtn -> setGeometry ( 50 , 40 , 75 , 30 ) ; // изменяем размеры кнопки в пикселях и помещаем на форму окна

При нажатии на кнопку, генерируется сигнал clicked . Слот — это метод, который реагирует на сигнал. В нашем случае это будет слот quit основного объекта приложения. QApp — это глобальный указатель на объект приложения. Он определен в заголовочном файле QApplication.

Результат выполнения программы:



Взаимодействие виджетов

Мы заканчиваем этот урок примером, который демонстрирует возможность виджетов взаимодействовать друг с другом. Код данного примера разделен на три файла.

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

Заголовочный файл — plusminus.h:

Q_OBJECT // этот макрос должен включаться в классы, которые объявляют свои собственные сигналы и слоты

У нас есть две кнопки и виджет lbl . С помощью кнопок мы увеличиваем или уменьшаем число, отображаемое в lbl .

Файл реализации — plusminus.cpp:

А здесь происходит соединение сигналов clicked с соответствующими слотами:

В методе OnPlus() мы определяем текущее значение в lbl . Виджет lbl отображает строковое значение, поэтому сначала его нужно преобразовать в целое число. Затем мы это число увеличиваем, конвертируем получившееся число снова в строковое значение и устанавливаем новый текст для label :

lbl -> setText ( QString :: number ( val ) ) ; // конвертируем обратно в Qstring и устанавливаем новый текст для label

Метод OnMinus() отличается от метода OnPlus() только тем, что в OnMinus() значение не инкрементируется, а декрементируется (уменьшается на единицу).

А это уже наш основной файл — main.cpp:

Результат выполнения программы:



Заключение

На этом уроке мы создали наши первые графические программы с помощью Qt5, а на следующем уроке мы рассмотрим подключение стандартных меню и панелей инструментов (тулбаров).

Урок №5. Работа с файлами и каталогами в Qt5

Комментариев: 29

Насчёт добавления иконки — приведённый код не захотел работать.
Делал в Qt creator 4.14.2 (Qt 5.15.2)

Как я его заставил работать:
1. Положил иконку в папку с проектом. Я использовал файл с расширением *.ico
2. В QT-Creator ПКМ по проекту — "добавить новый…" — раздел в шаблонах "Qt" — "Файл ресурсов Qt" — выбрать — пишем имя_файла_ресурсов (например res) — Далее — завершить
3. По умолчанию файл ресурсов должен открыться в редакторе. Если не открылся: ПКМ по файлу ресурсов — "открыть в редакторе"
4. "Добавить префикс" — поменять имя. Я использовал "/ico". Имя запомнить. В дальнейшем это важно.
5. Выделяем появившуюся папку с префиксом "/ico" — "Добавить файлы" — выбираем файл с иконкой
6. В коде меняем адрес файла по следующему образцу

Если не получится — проверяйте наличие в файле проекта имя_проекта.pro наличие строчки RESOURCES += \имя_файла_ресурсов.qrc

Здравствуйте, прямоугольные кнопки с текстом — это хорошо, но, скажите, пожалуйста, есть ли возможность вставить картинку и сделать её кнопкой? (Т.е. чтобы при нажатии на картинку, например, закрывалась программа?)

Да. У картинки есть конструктор, принимающий Pixmap. Потом соединяем QPushButton::clicked и QApplication::quit и всё

Подскажите пожалуйста, почему в примере про взаимодействие виджетов в классе PlusMinus в списке private членов указан только один label, а две кнопки — не указаны, и создаются в конструкторе?

Потому что виджет lbl мы используем в методах OnPlus/OnMinus, т.е. нам нужно иметь доступ к этому виджету. В то время как кнопки нам нужно только создать

Расскажите пожалуйста о методе move().

Дмитрий Бушуев :

Тут всё очень просто: метод move(300, 300) перемещает виджет (в нашем случае — окно) в позицию с координатами (300,300).

P.S.: Попробуйте поставить другие значения координат и посмотреть на результат 🙂

Добрый день!
Пытаюсь изучать с вашей помощью QT, за что Вам огромное спасибо!)
У меня возник такой вопрос) в программе есть такая штука как дизайнер, с помощью которой удобно создавать объекты на нашем окне приложения и сигналы со слотами)
Какие у этого способа минусы и каким способом лучше писать приложения?)

Дмитрий Бушуев :

И вам спасибо за вашу благодарность.
По поводу вопроса — лучше выбирать тот способ, которым вам удобнее пользоваться.
Плюсы Qt-дизайнера в том, что вы сразу можете видеть результат вашей работы. Как следствие — меньше головной боли, особенно если в приложении используются различные (в том числе вложенные) компоновки.
Минусы же его состоят в том, что, если вам нужно сделать что-то, чего нет в стандартном наборе компонентов, то добро пожаловать в написание кода "голыми руками" 🙂

Походу да — нужно выбирать что типа QT widget application.
Для меня тоже немного сложновато, некоторых неочевидных вещей нехватает. Плюс еще плаваю в самом C++

Как решили ситуацию?(У меня сейчас подобное происходит)

Дмитрий Бушуев :

Создайте проект типа "Приложение Qt Widgets"…

Дмитрий Бушуев :

Нужно создавать проект типа "Приложение Qt Widgets".

QT+=core gui widgets
CONFIG += c++11

Пишет, что С++ требует type specifier for all declarations.

Вообще я так посмотрел, без увернного знания С++ в QT делать нечего? Смотрю как баран на новые ворота на все жти квадраточия, наследования классов, т.п. Перывые пару уроков еще зашли, а дальше банальное "переписывание с доски"…эх…
Замкнутый круг, чтоб научиться прогать на С++ нужно уметь прогать на С++…

Дмитрий Бушуев :

Проверил у себя. Всё работает.

Добрый день. Подскажите пожалуйста в примере с курсорами в конструкторе класса Cursors задается стандартное значение указателя parent = 0. Можно ли туда заместо 0 передавать nullPtr?

Дмитрий Бушуев :

Немного не понял вопроса… Если вы имеете в виду — можно ли вместо parent = 0 использовать parent = nullPtr, то ответ — да, можно. Вообще говоря, в наших уроках с этим проблем нет, но вот в более серьезных программах предпочтительнее использовать вариант parent = nullPtr, т.к. из-за автоприведения типов в Си++, которое иногда (неочевидным образом) может приводить 0 или NULL (который заменяется на 0) к целому числу и вызывать косяки.

Насчёт первого примера — лучше бы воспользоваться QHBoxLayout, всё-таки он чуть быстрее, да и нужны в группировке таблицей тут нет… А вообще да, спасибо за труд.

Дмитрий Бушуев :

Т.е. в QT есть что-то типа garbage collector? А можно поподробнее, как он здесь работает?

Дмитрий Бушуев :

В Qt есть есть класс, который является базовым для всех других классов и объектов. Называется он — QObject. Когда вы создаете свой класс или объект при помощи прямого наследования (непосредственно от QObject) или косвенного (через цепочку промежуточных классов, которые были наследованы от QObject), то вам становится доступен механизм связи объектов, а именно: организация в т.н. иерархии (или деревья объектов). Чтобы его задействовать, нужно при создании объекта-потомка передавать в качестве параметра указатель на объект-предок. И тогда, при удалении родительского объекта, Qt автоматически удалит и всех связанных с ним потомков.

Пример для наглядности:

QObject* child3 = new QObject ( child1 ) ; //Можно и так сделать, т.е. назначить child1 родителем для child3

delete parent ; // Удаляем объект parent. При этом Qt автоматически удалит и все связанные с ним объекты-потомки: child1, child2, child3

Простите, вот я такой момент недопонял: в конструкторе классов создаются указатели с выделением памяти. Как потом очищается память? Если эти указатели были бы полями класса, инициализировались в конструкторе и в деструкторе delete`лись, я бы понял. А так получается утечка памяти, вроде как. Поясните этот момент, пожалуйста

Дмитрий Бушуев :

>>Как потом очищается память?
Обратите внимание на второй параметр ("this") в примере ниже:

Я пытаюсь создать кнопку переключения в Qt Designer. Я также ссылаюсь на интернет, но не могу найти, как это сделать. Может кто-нибудь знает, как сделать тумблер. Я приложил образец изображения кнопки.

toggle button

2 ответа

Возможное решение - использовать таблицу стилей с QCheckBox. Просто отредактируйте таблицу стилей для флажка с помощью следующего кода:

Минимальный бегущий пример:

К сожалению, это не всегда хорошо работает, если вам нужно немного изменить размер и хотите, чтобы флажок корректировал его внешний вид.

Единственная альтернатива - это создать подкласс QPushButton / QAbstractButton (со свойством checkable() , установленным в True ) и реализовать paintEvent самостоятельно, как уже было предложено в ответ от eyllanesc.

Qt Designer, чтобы установить положение и инициализировать некоторые свойства виджетов в окне, но он не работает для создания виджетов с настраиваемой раскраской в качестве переключателя, поэтому вам придется реализовать с Python. Давным-давно для проекта внедрили переключатель поэтому он покажет этот код:

Примечание. Еще одним возможным решением в мире Qt является использование переключателя QML 1 , 2 .

БлогNot. QT: "одноразовые" кнопки

QT: "одноразовые" кнопки

Была на днях проблемка у человека, вот к ней пример. Требовалось иметь в программе набор кнопок, нажатия которых будут "одноразовыми", то есть, кнопка после первого нажатия выполняет некий код и деактивируется. При этом, писать кучу однотипных обработчиков нажатия кнопок не хочется, а хочется иметь один слот-обработчик, который будет как-то различать кнопки между собой (какая именно из них была нажата). Разумеется, вместо кнопок можно и с другими компонентами обращаться по аналогии.

Нет ничего легче. С помощью QT Creator создадим класс-потомок QWidget : меню Файл - Новый файл или проект - слева выбрать "Приложения", справа "Приложение Qt Widgets", нажать кнопку "Выбрать", ввести какое нужно Название, например, OneClick , нажать кнопку "Далее" еще 2 раза, выбрать базовый класс = QWidget , указать нужное Имя класса, например, Widget . Форму создавать не нужно, мы её создадим программно, так что отключаем эту галочку. Снова жмём кнопку "Далее", потом "Завершить".

В заголовочном файле widget.h предусмотрим метод createButton для программного создания одной кнопки с нужной надписью и слот slotButtonClicked , который будет обрабатывать нажатия всех кнопок, вот полный код файла:

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