Как соединить два разных объекта - PullRequest
0 голосов
/ 23 июня 2019

У меня есть два объекта, один будет держать график, а другой несколько кнопок. Как использовать (подключиться), чтобы при нажатии кнопки 1 надпись отображалась в дебаге или график заполнялся новым?

Например, я нажимаю кнопку, созданную классом BtnBox, и отображается мой график. Как использовать connect ()?

main.cpp

#include "mainwindow.h"
#include <QApplication>
#include <QThread>
#include "btnbox.h"
#include "plot.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    BtnBox *panel = new BtnBox(&a);
    Plot *plot = new Plot();

    QObject::connect(panel, SIGNAL(clickedBtn1()), plot, SLOT(slotPrinter()));
//    panel->show();

    QHBoxLayout *mainLayout = new QHBoxLayout;
    mainLayout->addWidget(plot);
    mainLayout->addWidget(panel);

    QWidget window;

    window.setLayout(mainLayout);
    window.show();

    return a.exec();
}

Ответы [ 2 ]

0 голосов
/ 23 июня 2019

Может быть, вы можете использовать сигнал QPushButton::clicked и написать что-то вроде этого:

connect(ui->pushButtonObj, &QPushButton::clicked, plot, &Plot::slotPrinter);

Но если вы хотите настраивать поведение с вашим классом BtnBox, вы можете создать в заголовочном файле BtnBox сигнал.

signals:
    void clickedBtn1();

И используйте: emit clickedBtn1(); всякий раз, когда вы хотите его излучать, ваше соединение должно работать.

Нет необходимости в реализации сигнала, вы просто должны его излучать.

Ключевое слово emit на самом деле не нужно, если вы хотите, вы можете просто использовать clickedBtn();

0 голосов
/ 23 июня 2019

Хорошо, я предполагаю, что у вас есть class BtnBox, и это уже есть в определении класса (обычно в файле .h):

signals:
    void clickedBtn1();

Qt moc сгенерирует реализацию этого метода, здесь вам не нужно больше ничего делать. Но вам нужно получить этот сигнал. Во многих случаях вы бы добавили emit clickedBtn1(); в нужных местах, но в этом случае вы, вероятно, захотите сделать что-то подобное в конструкторе BtnBox::BtnBox:

connect(ui->button1, SIGNAL(clicked()), this, SIGNAL(clickedBtn1()));

Подключение сигнала к сигналу просто сделает пересылку сигнала. Замените ui->button1 на правильный указатель на кнопку, что бы у вас не было в вашем коде.


Примечание о том, как не сделать это, просто чтобы дать немного пищи для размышлений: альтернативным способом было бы выставить кнопку 1 из класса, так что в вашем main() тогда вы могли бы сделать что-то вроде этого: QObject::connect(panel->getButton1(), SIGNAL(clickedBtn1()), plot, SLOT(slotPrinter()));. Но это, как правило, считается немного грязным, выставляя внутренности класса BtnBox таким образом. Лучше выставить сигнал, и тогда коду, использующему класс, не нужно заботиться о том, как он излучается (например, из нескольких различных частей BtnBox), или как может измениться внутренняя реализация BtnBox (например, преобразование это в QML).

...