Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
121 / 109 / 29
Регистрация: 18.12.2010
Сообщений: 378

Приведите простой пример использования сигнала-слота

28.10.2013, 08:00. Показов 2678. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер.

Начал изучение Qt (по книге Макса Шлее, интернету). Никак не разберусь с сигнально-слотовой системой.

Вот например, я хочу создать виджет, на котором есть кнопка (QPushButton) и картинка (QLabel, пустая изначально). Теперь я хочу сделать так, чтобы при нажатии на кнопку внутри картинки что-то изменилось, например, нарисовался эллипс.

С созданием виджетов проблем нет. А вот когда я хочу связать сигнал и слот, надо, наверно, написать что-то вроде:
C++ (Qt)
1
2
QObject::connect(&button1, SIGNAL(clicked()), // а дальше надо передать
  // указатель на объект какого-то класса, который способен принять сигнал и изменить картинку
А как написать этот класс (так, чтобы он в состоянии был обратиться к картинке), я никак не пойму. Вы не могли бы привети простой примертакой программы или объяснить, как это делать?

Добавлено через 10 часов 1 минуту
painter.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#ifndef PAINTER_H
#define PAINTER_H
 
#include <QObject>
#include <QImage>
#include <QLabel>
#include <QPainter>
 
class mPainter : public QObject
{
    Q_OBJECT
public:
    mPainter();
 
public slots:
    void draw(QLabel * lbl);
};
 
#endif // PAINTER_H
painter.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "painter.h"
 
mPainter::mPainter() : QObject()
{
}
 
 
void mPainter::draw(QLabel *lbl)
{
    QPainter p(lbl);
    p.setPen(Qt::blue);
    p.setFont(QFont("Arial", 30));
    p.drawEllipse(1,1,100, 100);
}
main.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <QtGui>
#include <QApplication>
#include <QPushButton>
#include <QLabel>
#include <QImage>
 
#include "painter.h"
 
int main(int argc, char *argv[])
{
    QApplication application(argc, argv);
    QPushButton btn("Draw");
    QLabel lbl;
    mPainter paint1;
 
    lbl.resize(640, 480);
    QObject::connect(&btn, SIGNAL(clicked()), &paint1, SLOT(draw(&lbl)));
    lbl.show();
    btn.show();
    QPainter p1(&lbl);
    p1.drawLine(1,1,20, 29);
    return application.exec();
}
Эта программа комплируется, но по нажатию кнопки линия не рисуется. В чём может быть дело?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.10.2013, 08:00
Ответы с готовыми решениями:

Приведите пример использования QLayout'ов
Как я понял, с помощью QLayout'ов можно добиться того, что элементы внутри них будут в зависимости от размеров окна менять свои размеры и...

Реализация сигнала-слота
bh = new BluetoothHandler(); //создаем объект класса, отвечающего за обработку и отправку данных connect(this,...

Соединение сигнала и слота
при попытке соединить слот и сигнал пишет 'QObject::connect' : none of the 3 overloads could convert QWidget wgt; QPushButton*...

2
419 / 418 / 72
Регистрация: 27.05.2012
Сообщений: 1,168
28.10.2013, 16:31
mainwindow.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <QLabel>
 
class Label: public QLabel
{
    Q_OBJECT
    bool m_showRect;
public:
    Label(QWidget* parent = 0);
 
    virtual void paintEvent(QPaintEvent *ev);
public slots:
    void showRect();
};
mainwindow.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include "mainwindow.h"
#include <QPainter>
 
Label::Label(QWidget *parent): QLabel(parent), m_showRect(false)
{
    setStyleSheet("background: green");
}
 
void Label::paintEvent(QPaintEvent *ev)
{
    if(m_showRect)
    {
        QPainter painter(this);
        painter.setPen(Qt::red);
        QRect pRect(rect().center(), QSize(20, 20));
        painter.drawRect(pRect);
    }
    QLabel::paintEvent(ev);
}
 
void Label::showRect()
{
    m_showRect = true;
    repaint();
}
main.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <QApplication>
#include <QHBoxLayout>
#include <QPushButton>
#include "mainwindow.h"
 
int main(int argc, char** argv)
{
    QApplication app(argc, argv);
 
    QWidget wgt;
 
    QHBoxLayout* bLayout = new QHBoxLayout;
    Label* lbl = new Label;
    bLayout->addWidget(lbl);
 
    QPushButton* pButton = new QPushButton;
    bLayout->addWidget(pButton);
    QObject::connect(pButton, SIGNAL(clicked()), lbl, SLOT(showRect()));
 
    wgt.setLayout(bLayout);
    wgt.resize(200, 200);
    wgt.show();
    return app.exec();
}
2
121 / 109 / 29
Регистрация: 18.12.2010
Сообщений: 378
28.10.2013, 18:04  [ТС]
Спасибо большое!!! буду рабираться
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.10.2013, 18:04
Помогаю со студенческими работами здесь

Связывание сигнала и слота из разных классов
Доброго времени суток. Сделал сигнал в одном классе и слот для этого сигнала, который определён в другом классе. GetProjectTree()...

Узнать связи конктретного сигнала/слота
Суть в сабже. Можно ли (возможно через QMetaObject) узнать, подключен ли конкретный слот / сигнал к какому - нибуть другому сигналу /...

Соединения слота одного класса и сигнала другого
Здравствуйте! Недавно начал изучать Qt и столкнулся с проблемой соединения слотов и сигналов. У меня есть класс MainWindow и RLE класс. В...

Странная ошибка при привязке сигнала и слота. Использую Qt
ругается на строчку: QObject::connect(mw-&gt;QWdownloadProgramm, SIGNAL(clicked()), vw, SLOT(QWDownloadCliked())); пишет: ошибка: нет...

Приведите пару примеров использования QValidator
Всем привет! Приведите, пожалуйста, парочку примеров использования QValidator в Qt Creator. Применимо к textEdit желательно. Что-то...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru