0 / 0 / 0
Регистрация: 23.03.2016
Сообщений: 6
1

Взаимодействие сигналов и слотов с элементами на форме

15.08.2017, 17:45. Показов 854. Ответов 6

Здравствуйте.

Есть класс GS связанный с объектом QGraphicsView на форме MainWindow. При нажатии на сцену, класс GS формирует сигнал и передает его в слот getData(QPoint) принадлежащий классу формы. Этот сигнал проходит и данные можно вывести через QMessageBox. Но из слота getData(QPoint) я не могу передать эти данные никаким другим объектам формы. Не могу вывести данные через lineEdit или вызвать любую процедуру

gs.h
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
26
27
28
29
30
class MainWindow;
 
 
namespace Ui {
class GS;
 
}
 
class GS: public QGraphicsView
 
{
        Q_OBJECT
public:
 
    GS(QGraphicsView *parent = 0);
    ~GS();
 
signals:
    void sentData(QPoint);
 
 
protected:
 
    virtual void mousePressEvent(QMouseEvent* xy1);
 
private:
    GS *gs;
    MainWindow *mainw;
 
};


gs.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
GS::GS(QGraphicsView *parent)
    : QGraphicsView(parent)
{
    mainw=new MainWindow();
    connect(this, SIGNAL(sentData(QPoint)), mainw , SLOT(getData(QPoint)));
 
}
 
 
void GS::mousePressEvent(QMouseEvent* xy1)
{
    QPoint pos1 = xy1->pos();
    emit sentData(pos1);
 
}
mainwindow.h
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include "gs.h"
 
namespace Ui {
class MainWindow;
 
}
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
 
 
signals:
    void SentPin(QPoint);
 
public slots:
    void getData(QPoint pinxy);
 
 
private slots:
    
    void GetPin(QPoint pinxy2);
 
 
private:
    Ui::MainWindow *ui;
    MainForm *myform;
    Hist *histform;
    formFit *Fit;
    Plot *formplot;
    Mat *matform;
 
    QPoint pospin1;
    QPoint pospin2;
 
    GS *gs;
    QGraphicsScene *scene;
 
};

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
26
27
28
29
void MainWindow::getData(QPoint pinxy)
{
    pospin1 = pinxy;
    QPoint pinxy2=pospin1;
    QString posx=QString::number(pospin1.x());
    QString posy=QString::number(pospin1.y());
    QMessageBox mBox;
    mBox.setText(posx+"/"+posy);
    mBox.exec();
 
    //ui->lineEdit_9->setText("pin");
 
    //GetPin(pinxy2);
 
   QObject::connect(this, SIGNAL(SentPin(QPoint)), ui , SLOT(GetPin(QPoint)));
   emit SentPin(pinxy2);
 
 
}
 
void MainWindow::GetPin(QPoint pinxy2)
{
    pospin2 = pinxy2;
    QString posx=QString::number(pospin2.x());
    QString posy=QString::number(pospin2.y());
 
    ui->lineEdit_9->setText(posx+" "+posy);
 
}
Не помог ни один вариант вывода координат через lineEdit. Ни напрямую, ни через другую процедуру.
В чем может быть причина?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.08.2017, 17:45
Ответы с готовыми решениями:

Использование сигналов и слотов
Каким образом засчет сигналов и слотов можно запустить нужную функцию при запуске главной формы?...

Надёжность сигналов-слотов
Всем привет! Представьте Программа, выполняющая сканирование сайтов на предмет обновлений...

Концепция сигналов и слотов
Часто, когда просматриваю проекты, написанные другими программистами, встречаю примерно такое: ...

Связывание сигналов и слотов
Приветствую! Возникла проблема со связыванием сигнала и слота. Есть класс-приемник(MainWindow) и...

6
184 / 176 / 57
Регистрация: 25.09.2014
Сообщений: 828
15.08.2017, 18:03 2
main.cpp свой покажи. Ибо я пока не понимаю, зачем тебе включение класса MainWindow внутрь своего класса вьюхи...
0
nd2
3422 / 2802 / 1252
Регистрация: 29.01.2016
Сообщений: 9,426
15.08.2017, 21:26 3
Цитата Сообщение от Trurly Посмотреть сообщение
C++ (Qt)
1
QObject::connect(this, SIGNAL(SentPin(QPoint)), ui , SLOT(GetPin(QPoint)));
C++ (Qt)
1
QObject::connect(this, SIGNAL(SentPin(QPoint)), this, SLOT(GetPin(QPoint)));
0
0 / 0 / 0
Регистрация: 23.03.2016
Сообщений: 6
16.08.2017, 11:55  [ТС] 4
Горбаг, в main.cpp только запуск MainWindow, остальное в хэдерах.
Класс MainWindow включается в gs чтобы объявить mainw и отправить сигнал с gs на mainwindow. Иначе выдавал ошибку.
nd2, спасибо, не помогло. Мэсседжбоксы по-прежнему всплывают, а отклика в лайнэдит - нет.
0
nd2
3422 / 2802 / 1252
Регистрация: 29.01.2016
Сообщений: 9,426
16.08.2017, 14:18 5
Цитата Сообщение от Trurly Посмотреть сообщение
в main.cpp только запуск MainWindow
Конструктор MainWindow покажи, и коннект в конструктор перенеси из getData().
0
184 / 176 / 57
Регистрация: 25.09.2014
Сообщений: 828
16.08.2017, 14:22 6
Код мог написать с косяками, но вот суть - тебе не нужно во вьюхе знать о главном окне. Это в главном окне ты создаешь вьюху. Там же ты и соединяешь сигнал вьюхи со своим слотом. Вьюха должна лишь его испускать. А слушает его кто-то или нет - вьюхе пофигу.

mainwindow.h
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 "gs.h"
 
namespace Ui {
class MainWindow;
 
}
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
 
public slots:
    void getData(QPoint pinxy);
 
private:
    Ui::MainWindow *ui;
 
    GS *gs;
    QGraphicsScene *scene;
 
};
mainwindow.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
c-tor() // твой конструктор, который я не буду тут расписывать целиком, лишь часть его тела
{
...
gs = new GS(this);
scene = new QGraphicsScene();
ds->setScene(scene);
 
connect(gs, &GS::sentData, this, &MainWindow::getData);
// ну или так, если ты еще не понимаешь преимуществ нового вида коннекта сигналов и слотов
// connect(gs, SIGNAL(sentData(QPoint)), this, SLOT(getData(QPoint)));
}
 
void MainWindow::getData(QPoint pinxy)
{
ui.lineEdit->setText(...); // пришедший QPoint преобразуешь в текст по вкусу
}
И тебе не нужно будет никакое включение. А твое главное окно и так знает про свою графическую часть. Поэтому ты легко в слоте getData обращаешься к ней и устанавливаешь в нужный тебе лайнэдит через "ui.лайнэдит" пришедшее значение.
1
0 / 0 / 0
Регистрация: 23.03.2016
Сообщений: 6
28.08.2017, 16:25  [ТС] 7
Горбаг, большое спасибо. Это помогло.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.08.2017, 16:25

Аналог сигналов и слотов в с++
мне сказали что для асинхронных вызовов при передачи данных подходит использование сигналов слотов...

Быстродействие сигналов и слотов
В документации сказано: В ДЕСЯТЬ раз!!!!11 Почему так много? Ведь соответствие сигнатур...

Не работает Инструмент сигналов-слотов
Вроде бы, что может быть легче чем сигналы и слоты, но, вот оно что: У меня есть два файла (на...

Создание собственных сигналов и слотов
Программа имеет считывать данные с консоли, используя класс QTextStream, и записывать их в...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru