4

私には2つの機能があります。ある関数では、QImageその QImage を別の関数に渡したいと思います。どちらの関数にも異なる引数があります。どうすればいいのか教えてください。

CMakeLists.txt

cmake_minimum_required(VERSION 2.4.6)
include($ENV{ROS_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 

選択インターフェイス.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();
}
4

1 に答える 1

12

まず第一に、関数というよりもメソッドという用語を使用する方が適切です。これらはクラス メンバーであり、ほとんどの人がこれらのメソッドを呼び出していることがわかるからです。つまり、これらは Image クラスのメンバーです。

Image クラス内でメンバー変数を使用できます。これは、最初のメソッドと 2 番目のメソッド内でアクセスできます。

クラスメンバー

#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) では不十分な場合があり、コストのかかる操作を避けるためにポインター メンバーを使用することをお勧めします。

copy メソッドのドキュメントはこちらにあります。サブエリアを指定しない場合、デフォルトで全体がコピーされます。

方法 1 で設定した同じファイル内で静的変数を使用し、方法 2 でアクセスすることもできます。その場合、別のアプローチを取得するには、クラスの外側で静的変数を定義する必要があります。これはおそらくクラスメンバーよりも使用頻度が低いので、私はそれを好みます。

おそらく、外部クラスまたは変数に画像を設定してからアクセスすることもできます。これはすべて、特定のケースに大きく依存します。これは幅広い質問です。

drawImage() を使用して「ソース」を「宛先」に描画するために、いつでも QPainter を使用することもできます。

于 2013-09-07T18:41:51.387 に答える