在窗口小部件和主窗口之间连接并传递数据

时间:2016-05-09 16:17:16

标签: c++ qt

我想在MainWindow和Widget之间传递数据,我绘制图形。 在MainWindow中,我加载数据,做一些事情并创建动态数组。

  1. 我需要将此数组从主窗口传递给窗口小部件以绘制图形。
  2. 在小部件文件中,当我单击MainWindow中的按钮
  3. 时,我有一个有效的功能

    我不知道如何在两个文件mainwindow.cpp和drawwidget.cpp之间执行此操作

    这是我的代码:

    mainwindow.cpp:

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <QFileDialog>
    #include <fstream>
    #include <iostream>
    #include <iomanip>
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    }
    
    MainWindow::~MainWindow()
    {
        wyczyscpkt(Tab_pkt);
        wyczysc(Tab_we);
        delete ui;
    }
    

    mainwindow.h:

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    
    namespace Ui {
    class MainWindow;
    }
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
    
    signals:
    
    
    private slots:
    void on_saveimageButton_clicked();
        //other functions
    
    public slots:
    
    private:
        Ui::MainWindow *ui;
        //my functions
    
     public slots:
    
    };
    
    #endif // MAINWINDOW_H
    

    drawwidget.cpp:

    DrawWidget::DrawWidget(QWidget *parent) :
        QWidget(parent)
    {
    
    }
    
    void DrawWidget::paint(QPainter &painter, struct *myarray) //here I need pass array from mainwindow.cpp
    {
     //drawing function
    }
    void DrawWidget::savePng()
    {
     //save image function
    }
    

    drawwidget.h:

    #ifndef DRAWWIDGET_H
    #define DRAWWIDGET_H
    
    #include <QWidget>
    #include "mainwindow.h"
    
    
    class DrawWidget : public QWidget
    {
        Q_OBJECT
    public:
        explicit DrawWidget(QWidget *parent = 0);
    
    protected:
        void paintEvent(QPaintEvent *);
        void paint(QPainter &painter);
        void savePng();
    
    };
    
    #endif // DRAWWIDGET_H
    

2 个答案:

答案 0 :(得分:2)

您可以使用signals and slots在两个基于QObject的类(如QMainWindow和QWidget)之间传递数据,这些类之间对彼此一无所知。

  1. 您需要使用DrawWidget插槽连接您的MainWindow信号。当您在MainWindow中发出信号时,DrawWidget对象将在其插槽中接收结构。请注意,您需要使用Q_DECLARE_METATYPE注册自己的结构类型,以便将其传递给信号参数。
  2. 同样,您可以使用DrawWidget中的插槽方法连接按钮的clicked信号,当您点击该按钮时,该方法会触发。
  3. 示例:

    typedef struct
    {
    } MyStruct; 
    
    Q_DECLARE_METATYPE(MyStruct);
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    signals:
        void dataChanged(const MyStruct &struct);
    };
    
    class DrawWidget : public QWidget
    {
        Q_OBJECT
    public slots:
        void handleData(const MyStruct &struct);
    };
    

    让我们假设你在main()中实例化你的对象。您可以将MainWindow信号连接到DrawWidget插槽,如下所示:

    MainWindow m;
    DrawWidget d;
    QObject::connect(&m, SIGNAL(dataChanged(const MyStruct &)),
                     &d, SLOT(handleData(const MyStruct &)));
    

    当您在MainWindow中准备好数据时,您将以数据结构作为参数发出信号。

    对信号和广告位here有一个很好的解释。

答案 1 :(得分:0)

你必须包括

#include "drawwidget.h"

你在MainWindow中的DrawWidget。之后,您可以实例化DrawWidget对象并使用它。