2016-05-09 8 views
1

グラフを描画するMainWindowとウィジェットの間でデータを渡したいと思います。 MainWindowでは、データを読み込み、いくつか行い、動的配列を作成します。ウィジェットとメインウィンドウの間でデータを接続して渡します

  1. この配列をメインウィンドウからウィジェットに渡してグラフを描画する必要があります。私は2つのファイル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

    signals and slotsは、QMainWindowやQWidgetなどの2つのQObjectベースのクラス間でデータを渡す際に、互いに何も知らないデータを渡すことができます。 にあなたが必要

    1. あなたDrawWidgetスロットを使用してメインウィンドウの信号を接続します。 MainWindowで信号を出力すると、DrawWidgetオブジェクトはそのスロットに構造体を受け取ります。信号パラメータに渡すには、独自のstruct型をQ_DECLARE_METATYPEで登録する必要があることに注意してください。
    2. 同様に、ボタンをクリックしたときにトリガーするDrawWidgetのスロットメソッドとボタンのclicked信号を接続することができます。

    例:

    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); 
    }; 
    

    )(あなたはあなたのメインの中で、あなたのオブジェクトをインスタンス化しましょう。あなたはこのようDrawWidgetスロットにメインウィンドウの信号を接続することができます。

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

    あなたのメインウィンドウでのデータの準備ができているときは、パラメータとしてデータ構造体に信号を発します。

    信号とスロットの説明がありますhere

    +0

    しかし、信号をスロットに接続する方法はありますか?私は試しました: connect(MainWindow、SIGNAL(dataChanged(MyStruct *&struct))、this、SLOT(handleData(Mystruct *&struct))); でも動作しませんでした。 – kubizen

    +0

    私は私の答えを改善し、あなたが通過すべき説明へのリンクを加えました。 – talamaki

    +0

    ありがとうございます:Dそれはほとんど動作します。私はウィジェットにデータを送ることができますが、私の唯一の問題は、私が図面を拡大するためのパラメータを送信すると、それは更新されません。そのコード: 'void DrawWidget :: handleData(MyStruct *&Array) { p = Array [2] .x; } ' ' void DrawWidget :: paintEvent(QPaintEvent *){ QStyleOption opt; opt.init(this); QPainterペインタ(this);style() - > drawPrimitive(QStyle :: PE_Widget、&opt、&painter、this); painter.setRenderHint(QPainter :: Antialiasing); paint(painter); painter.end(); } ' ' void DrawWidget :: paint(QPainter&painter){ painter.drawLine(1 * p、5 * p、3 * p、4 * p); }私のコードが読みにくい場合は申し訳ありません – kubizen

    0

    あなたがメインウィンドウで

    #include "drawwidget.h" 
    

    あなたDrawWidgetを含める必要があります。その後、DrawWidgetオブジェクトをインスタンス化して使用することができます。

    関連する問題