两个对象QT之间的示例插槽/信号



我的应用程序包括2个不同的对象(qobject和qmainwindow),我想知道如何与插槽/信号之间进行通信。此外,现有的方法是否更好?

有人可以做一个简单的例子吗?谢谢:)

样本

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "ui_mainwindow.h"
#include "object.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
private:
    Ui::MainWindow *ui;
private slots:

};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "object.h"
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(ui->chkState, SIGNAL(clicked()), this, SLOT(object->chkState();));
}
MainWindow::~MainWindow()
{
    delete ui;
}

object.h

#ifndef OBJET_H
#define OBJET_H
#include "mainwindow.h"
#include <QMainWindow>
#include <QObject>
class Object : public QObject
{
    Q_OBJECT
public:
    explicit Object(QObject *parent = 0);
    bool state;
signals:
private slots:
    void chkState(Ui::MainWindow *ui);
};
#endif // OBJET_H

objet.cpp

#include "object.h"
#include "mainwindow.h"
Object::Object(QObject *parent) : QObject(parent)
{
}
void Object::chkState(Ui::MainWindow *ui)
{
    if (ui->chkState->isChecked())
    {
        ui->state->setText("true");
        state = true;
    }
    else
    {
        ui->state->setText("false");
        state = false;
    }
}

这是一个简单的示例,说明了如何发出信号和插槽。

        #ifndef MAINWINDOW_H
        #define MAINWINDOW_H
        #include <QMainWindow>
        #include "object.h"
        namespace Ui {
        class MainWindow;
        }
        class MainWindow : public QMainWindow
        {
            Q_OBJECT
        public:
            explicit MainWindow(QWidget *parent = 0);
            ~MainWindow();
        signals:
            void transmit_to_object(bool value);
        private slots:
            void receive_from_object(bool value);
            void on_checkBox_clicked();
        private:
            Ui::MainWindow *ui;
            object          m_object;
        };
        #endif // MAINWINDOW_H
    #ifndef OBJECT_H
    #define OBJECT_H
    #include <QObject>
    class object : public QObject
    {
        Q_OBJECT
        public:
            explicit object(QObject * parent = 0);
        signals:
            void transmit_to_gui(bool value);
        private slots:
            void receive_from_gui(bool value);
        private:
        bool state;
    };
    #endif // OBJECT_H
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(&m_object,SIGNAL(transmit_to_gui(bool)),this,SLOT(receive_from_object(bool)));
    connect(this,SIGNAL(transmit_to_object(bool)),&m_object,SLOT(receive_from_gui(bool)));
}
MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::receive_from_object(bool value)
{
    if(value)
    {
        ui->lineEdit->setText("true");
    }
    else
    {
        ui->lineEdit->setText("false");
    }
}
void MainWindow::on_checkBox_clicked()
{
    if(ui->checkBox->isChecked())
    {
        emit transmit_to_object(true);
    }
    else
    {
        emit transmit_to_object(false);
    }
}
#include "object.h"
#include "mainwindow.h"
object::object(QObject *parent)
{
}
void object::receive_from_gui(bool value)
{
    state = value;
    emit transmit_to_gui(state);
}

您的代码中有几个错误。第一:

connect(ui->chkState, SIGNAL(clicked()), this, SLOT(object->chkState();));

在这里您说:"当我们单击ui-> chkstate时,我希望您在此中调用一个函数,即对object-> chkstate插槽"。这绝对不是您想要的。什么是对象?此对象尚未创建。您想要的是:

connect(ui->chkState, SIGNAL(clicked()), myobject, SLOT(chkState()));

使用MyObject类型Object的对象,因此您需要在MainWindow.h a

中添加
Object *myobject;

在连接之前在您的mainwindow.cpp中:

myobject = new Object(this);

此外,您的功能void chkState(Ui::MainWindow *ui);无法正常工作,因为您无法在类似的参数中获得MainWindow UI。我建议您要做的事情,如果仅用于测试,所以您知道父母是MainWindow的类型,您可以做:

void Object::chkState()
{
    MainWindow* parent = static_cast<MainWindow*>(parent());
    if (parent->ui->chkState->isChecked())
    {
        parent->ui->state->setText("true");
        state = true;
    }
    else
    {
        parent->ui->state->setText("false");
        state = false;
    }
}

因此,删除了插槽中的参数。

最新更新