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

标签 c++ qt

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

  1. 我需要将这个数组从主窗口传递到小部件以绘制图形。
  2. 在小部件文件中,当我在主窗口中单击一个按钮时,我有一个函数可以工作

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

这是我的代码:

主窗口.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;
}

主窗口.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

最佳答案

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

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

例子:

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 .

关于c++ - 在小部件和主窗口之间连接和传递数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37120661/

相关文章:

c++ - 如何在更改编译器/操作系统方面使 C++ 代码健壮

c++ - 转换为不相关的引用类型是否违反了严格的别名规则?

c++ - 一个 QThread 对象中的槽函数可以并发运行吗?

c++ - 在 Linux-gnu/C++ 中哪里可以找到 qextserialenumerator 的 objbase.h

c++ - Qt Visual Studio 插件是 Qt Visual Studio 集成的子集吗?

c++ - 在 for 循环中显示索引图像

c++ - boost::bind 与 for 循环的性能分析比较

c++ - Windows 中崩溃进程的可预测退出代码

c++ - 撤消历史记录的问题(QUndoStack、QUndoView 和其他)

c++ - 从 Qt 5.7 切换到 Qt 5.8 - "the proxy type is invalid for this operation"