У меня есть две функции. В одной функции у меня есть QImage
а затем я хочу передать этот QImage к другой функции. Обе функции имеют разные аргументы. Пожалуйста, скажите мне, как я могу это сделать?
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>
#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
#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();
}
Прежде всего, лучше использовать термин методы скорее, чем функции, потому что это члены класса, и вы найдете большинство людей, называющих эти методы там А именно, это члены вашего класса 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) может быть недостаточно, и вы захотите использовать элемент указателя, чтобы избежать дорогостоящей операции.
Документацию можно найти Вот для метода копирования; по умолчанию будет скопировано целое, если вы не укажете подобласть.
Вы также можете использовать статическую переменную внутри того же файла, который вы установили в методе 1, и получить доступ в методе 2. Обратите внимание, что вы должны определить статическую переменную, в этом случае, вне класса, чтобы получить другой подход. Это, вероятно, используется реже, чем ученик, поэтому я бы предпочел это.
Возможно, вы также можете установить изображение на внешний класс или переменную, а затем получить доступ. Все зависит от вашего конкретного случая. Это широкий вопрос.
Вы также всегда можете использовать QPainter, чтобы нарисовать «источник» в «место назначения» с помощью drawImage ().
Других решений пока нет …