Evgenii Legotckoi
Evgenii Legotckoi14. September 2015 12:36

Qt/C++ - Lektion 018. QGraphicsItem – Die Vererbung und Slots

Lassen Sie uns nun ein wenig über das Vererben von QGraphicsItem und die Verwendung des SIGNAL und SLOT s-Systems bei der Interaktion mit Grafikobjekten in der Grafikszene QGraphicsScene. Das Ziel dieser Lektion besteht darin, eine Anwendung zu erstellen, in der ein Objekt der Klasse QGraphicsItem in der Grafikszene angezeigt wird, indem auf das Dialogfeld QMessageBox erscheint und signalisiert das Ereignis des Klickens auf das Grafikobjekt ...

Der Programmcode wurde in QtCreator 3.3.1 basierend auf Qt 5.4.1 geschrieben.

Projektstruktur für die Arbeit mit QGraphicsItem

Die Struktur dieses Projekts umfasst:

  • TestPoint.pro - Projektprofil;
  • mainwindow.h - Header-Datei des Hauptanwendungsfensters;
  • mainwindow.cpp - Quellcodedatei für das Hauptanwendungsfenster;
  • mypoint.h - Header-Code der Klasse, die von QGraphicsItem geerbt wurde;
  • mypoint.cpp - bzw. der Quellcode;
  • main.cpp - die Hauptdatei, von der aus die Anwendung startet, wird in der Lektion nicht berücksichtigt, da sie standardmäßig erstellt wird;
  • mainwindow.ui - Designdatei für das Hauptfenster.

mainwindow.ui

Die ganze Arbeit mit dieser Datei besteht darin, dass wir das Widget QGraphicsView in die Mitte des Hauptfensters werfen und es auf die Breite und Höhe des Fensters strecken.

mainwindow.h

Die Datei ist nur für die Deklaration der Grafikszene, unserer neuen Klasse MyPoint und dem SLOT für die Verarbeitung des SIGNALS von MyPoint bekannt.

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QGraphicsScene>
#include <QMessageBox>

#include <mypoint.h>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow  *ui;
    /* Объявляем графическую сцену и Точку с которой будем работать */
    QGraphicsScene  *scene;
    MyPoint         *point;

private slots:
    /* Слот для обработки сигнала из точки */
    void slotFromPoint();
};

#endif // MAINWINDOW_H

mainwindow.cpp

Hier ist es schon interessanter. In dieser Datei führen wir die Implementierung eines SLOTs aus und verbinden dieses SLOT auch mit einem Objekt der Klasse MyPoint. Und fügen dieses Objekt auch der Grafikszene hinzu.

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    /* Инициализируем графическую сцену с точку с которой будем работать */
    scene = new QGraphicsScene();
    point = new MyPoint();

    /* Подключаем сигнал из точки к СЛОТу в главном классе */
    connect(point,SIGNAL(signal1()),this, SLOT(slotFromPoint()));

    /* Устанавливаем графическую сцену в виджет */
    ui->graphicsView->setScene(scene);
    scene->addItem(point);  // И добавляем на сцену точку
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::slotFromPoint()
{
    QMessageBox::information(this,
                             "Зафиксировано нажатие",
                             "Вы нажали на точку!!!"
                             "\n"
                             "\n"
                             "\n      С Уважением, Ваш КЭП!!!");
}

mypoint.h

Der entscheidende Punkt in dieser Datei ist, dass diese Klasse Mehrfachvererbung verwendet, nämlich dass wir nicht nur von QGraphicsItem geerbt haben, sondern auch von QObject. Der Punkt ist, dass, wenn Sie nicht von QObject erben, dann funktionieren SINGALS und SLOTS nicht und das Projekt wird nicht kompiliert, wenn Sie die Funktion connect verwenden, um das SIGNAL von MyPoint, mit dem SLOT in MainWindow zu verbinden.

#ifndef MYPOINT_H
#define MYPOINT_H

#include <QObject>
#include <QGraphicsItem>
#include <QPainter>

/* Чтобы работали СЛОТЫ и СИГНАЛЫ, наследуемся от QOBJECT,
 * */
class MyPoint : public QObject, public QGraphicsItem
{
    Q_OBJECT
public:
    explicit MyPoint(QObject *parent = 0);
    ~MyPoint();

signals:
    /* Сигнал, который будет посылаться в том случае,
     * если произошел клик мышью по объекту
     * */
    void signal1();

protected:
    /* Перегружаем метод нажатия мышью, для его перехвата
     * */
    void mousePressEvent(QGraphicsSceneMouseEvent *event);

private:
    /* Данные методы виртуальные, поэтому их необходимо реализовать
     * в случае наследования от QGraphicsItem
     * */
    QRectF boundingRect() const;
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
};

#endif // MYPOINT_H

mypoint.cpp

Das Wichtigste, was ich in dieser Klasse zu beachten empfehle, ist, dass wir die Methode überschreiben, um das Ereignis des Klickens auf das Grafikobjekt mit der rechten Maustaste aufzurufen. Und wir nennen das SIGNAL in dieser Methode.

#include "mypoint.h"

MyPoint::MyPoint(QObject *parent)
    : QObject(parent), QGraphicsItem()
{

}

MyPoint::~MyPoint()
{

}

QRectF MyPoint::boundingRect() const
{
    /* возвращаем координаты расположения точки
     * по ним будет определяться нажатие точки
     * */
    return QRectF(0,0,100,100);
}

void MyPoint::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    // Устанавливаем кисть в QPainter и отрисовываем круг, то есть ТОЧКУ
    painter->setBrush(Qt::black);
    painter->drawEllipse(QRectF(0, 0, 100, 100));
        Q_UNUSED(option);
        Q_UNUSED(widget);
}

/* Переопределив метод перехвата события нажатия кнопки мыши,
 * добавляем посылку СИГНАЛА от объекта
 * */
void MyPoint::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
    emit signal1();
    // Вызываем родительскую функцию события нажатия кнопки мыши
    QGraphicsItem::mousePressEvent(event);
}

Ergebnis

Als Ergebnis sollten Sie die folgende Anwendung erhalten, die einen schwarzen Kreis im Fenster anzeigt, wenn Sie darauf klicken, öffnet sich ein Dialogfeld. Sie können sich auch das Video-Tutorial zu diesem Artikel ansehen, das eine Demonstration der Anwendung zeigt und zusätzliche Erklärungen zum Programmcode bietet.

Videoanleitung

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

E
  • 11. April 2019 08:15

Здравствуйте. А где описание функции signal1()?

Evgenii Legotckoi
  • 11. April 2019 08:29

Добрый день. Вы имели ввиду реализацию? Для сигналов в Qt реализация не пишется, это всё генерируется в moc файлах под капотом Qt.

E
  • 11. April 2019 08:49

Спасибо за ответ) У меня компоновщик на нее ругался просто. Оказалось, просто забыл Q_OBJECT в начале класса указать.

Kommentare

Nur autorisierte Benutzer können Kommentare posten.
Bitte Anmelden oder Registrieren
Letzte Kommentare
A
ALO1ZE19. Oktober 2024 08:19
Fb3-Dateileser auf Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов5. Oktober 2024 07:51
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55. Juli 2024 11:02
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr8. Februar 2024 18:43
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Jetzt im Forum diskutieren
J
JacobFib17. Oktober 2024 03:27
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
JW
Jhon Wick1. Oktober 2024 15:52
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Кирилл Гусарев27. September 2024 09:09
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
F
Fynjy22. Juli 2024 04:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

Folgen Sie uns in sozialen Netzwerken