在类方法之间传递一个 QImage 对象

Posted

技术标签:

【中文标题】在类方法之间传递一个 QImage 对象【英文标题】:Pass a QImage object between class methods 【发布时间】:2013-09-07 18:22:02 【问题描述】:

我有两个功能。在一个函数中,我有一个QImage,然后我想将该 QImage 传递给另一个函数。这两个函数都有不同的参数。请告诉我该怎么做?

CMakeLists.txt

cmake_minimum_required(VERSION 2.4.6)
include($ENVROS_ROOT/core/rosbuild/rosbuild.cmake)

rosbuild_init()


# Qt #####################################################
find_package(Qt4 REQUIRED)

set( QT_USE_QTGUI TRUE )

include($QT_USE_FILE)


add_definitions (-DQT_NO_KEYWORDS)

# All source files
set(SELECTION_INTERFACE_SOURCE_CPP
    src/SelectionInterface.cpp)

# All header files that use Qt Keywords (e.g. OBJECT)
set(SELECTION_INTERFACE_MOC_H
    src/SelectionInterface.h

)

# Wrap for MOC
qt4_wrap_ui (SELECTION_INTERFACE_UI_H $SELECTION_INTERFACE_UI)
qt4_wrap_cpp(SELECTION_INTERFACE_MOC $SELECTION_INTERFACE_MOC_H)

rosbuild_add_library (selection_interface_lib
    $SELECTION_INTERFACE_SOURCE_CPP
    $SELECTION_INTERFACE_MOC)


#set the default path for built executables to the "bin" directory
set(EXECUTABLE_OUTPUT_PATH $PROJECT_SOURCE_DIR/bin)
#set the default path for built libraries to the "lib" directory
set(LIBRARY_OUTPUT_PATH $PROJECT_SOURCE_DIR/lib)

rosbuild_add_executable(newtest_node src/SelectionInterface.cpp)
target_link_libraries (newtest_node selection_interface_lib $QT_LIBRARIES)

生成文件

include $(shell rospack find mk)/cmake.mk

清单

<package>
  <description brief="newTestCode">

     newTestCode

  </description>
  <author>admin</author>
  <license>BSD</license>
  <review status="unreviewed" notes=""/>
  <url>http://ros.org/wiki/newTestCode</url>
  <depend package="roscpp"/>
  <depend package="sensor_msgs"/>
  <depend package="std_msgs"/>

</package>

SelectionInterface.h

#ifndef SELECTION_INTERFACE_H
#define SELECTION_INTERFACE_H

    #include <QApplication>
    #include <QtGui/QWidget>
    #include <QtGui/QMenu>
    #include <QtGui/QAction>
    #include <QMainWindow>
    #include <QDebug>
    #include <QLabel>
    #include <QGraphicsPixmapItem>

    class Image:public QMainWindow
    
        Q_OBJECT

        public:

            void getImage();
            void displayImage();
            QImage tempImage;
    ;
    #endif 

SelectionInterface.cpp

#include "SelectionInterface.h"

void Image::getImage()

    QImage myImage("/home/usr/Pictures/image.jpg");

    qDebug() << myImage.height();

    tempImage= myImage.copy();



void Image::displayImage()

    QImage finalImage = tempImage;

    qDebug()<<finalImage.height();



int main (int argc, char** argv)

    QApplication app(argc, argv);

    Image object;
    object.getImage();
    object.displayImage();
    object.show();

    return app.exec();

【问题讨论】:

那么到底是什么问题呢? “我想将 QImage 从一个函数传递给另一个函数”对于 SO 来说太宽泛了。上面的代码似乎基本上可以传递图像:一种方法将 QImage 设置为成员变量,另一种方法使用它。它还有其他问题,但您似乎并没有询问它们。您需要帮助的问题是什么?另请阅读sscce.org 在另一个答案下的评论不是更新问题的好方法......无论如何,从疯狂的猜测部门,查看当前问题代码,尝试this-&gt;tempImage而不是tempImage在所有方法中代码。我怀疑你的真实代码有另一个 tempImage 隐藏成员变量......(当然你不应该让成员变量被隐藏,其他变量应该有不同的名称,这只是一个快速测试) 【参考方案1】:

首先,最好使用术语方法而不是函数,因为它们是类成员,你会发现大多数人都调用它们方法。也就是说,这些是您的 Image 类的成员。

您可以在 Image 类中为其使用成员变量,该成员变量可在第一个方法和第二个方法中访问。

班级成员

#include <QApplication>
#include <QMainWindow>
#include <QImage>
#include <QDebug>

class Image : public QMainWindow

    Q_OBJECT

    public:

        void getImage() 
            QImage myImage("/home/lpapp/Downloads/android.png");
            qDebug() << myImage.height();
            tempImage= myImage.copy();
        

        void displayImage() 
            QImage finalImage = tempImage;
            qDebug() << finalImage.height();
        

    private:
        QImage tempImage;
;

#include "main.moc"

int main (int argc, char** argv)

    QApplication app(argc, argv);

    Image object;
    object.getImage();
    object.displayImage();
    object.show();

    return app.exec();

这应该打印出相同的高度,以便快速验证。您可以在我的系统上找到以下命令,了解如何构建和运行此代码。您需要生成 moc 文件,然后为构建提供包含路径和库,最后运行应用程序。

moc-qt5 -o main.moc main.cpp && g++ -I/usr/include/qt/QtWidgets -I/usr/include/qt/QtGui -I/usr/include/qt/QtCore -I/usr /include/qt -fPIC -lQt5Core -lQt5Widgets -lQt5Gui main.cpp && ./a.out

输出:

900
900

尽管根据您的用例,写时复制 (COW) 可能不够用,您可能希望使用指针成员来避免代价高昂的操作。

复制方法的文档可以在here找到;如果您不指定子区域,它将默认复制整个区域。

您还可以在方法 1 中设置的同一文件中使用静态变量,并在方法 2 中访问。注意,在这种情况下,您应该在类外部定义静态变量以获得不同的方法。这可能不像类成员那样频繁使用,所以我更喜欢它。

您可能还可以将图像设置在外部类或变量上,然后访问。这在很大程度上取决于您的具体情况。这是一个宽泛的问题。

您也可以随时使用 QPainter,使用 drawImage() 将“源”绘制到“目标”中。

【讨论】:

以上是关于在类方法之间传递一个 QImage 对象的主要内容,如果未能解决你的问题,请参考以下文章

在类之间传递对象

C++ QT 在类结构中传递更高消息的最佳方法

如何在类层次结构中传递智能指针

内省(Introspector)

16. 在.NET中,一个页面对象是( )类的实例。

在 QImage 上调用 QObject::thread()