C
C
calculator2122021-04-08 18:08:55
Qt
calculator212, 2021-04-08 18:08:55

Why doesn't qt compile with cmake but does compile with qmake under ubuntu?

The problem is that qmake compiles fine, but the assembly with cmake gives an error, I suspect that I did not specify some lib.

terminate called after throwing an instance of 'cv::Exception'
  what():  OpenCV(4.5.2-dev) /opt/opencv/modules/highgui/src/window.cpp:580: error: (-213:The function/feature is not implemented) The library is compiled without QT support in function 'fontQt'


I built opencv with the -D WITH_QT=ON flag (and it builds normally through qmake)
Here are the flags for building either
cmake -D BUILD_TIFF=ON -D OPENCV_GENERATE_PKGCONFIG=YES -D WITH_CUDA=OFF -D ENABLE_AVX=OFF -D WITH_OPENGL=OFF -D WITH_OPENCL=OFF -D WITH_IPP=OFF -D WITH_TBB=ON -D BUILD_TBB=ON -D WITH_EIGEN=OFF -D WITH_V4L=ON -D WITH_VTK=ON -D BUILD_TESTS=OFF -D BUILD_PERF_TESTS=OFF -D WITH_GTK=ON -D WITH_QT=ON -D WITH_FFMPEG=ON -D WITH_GSTREAMER=ON -D CMAKE_BUILD_TYPE=RELEASE -D WITH_TBB=ON -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_EXTRA_MODULES_PATH=/opt/opencv_contrib/modules /opt/opencv/


CMakeLists.txt
cmake_minimum_required(VERSION 3.5)

cmake_minimum_required(VERSION 2.8)
project( DisplayImage )
find_package( OpenCV REQUIRED )
include_directories( ${OpenCV_INCLUDE_DIRS} )

set(Qt5_DIR "/home/us/qt_5.15c++/5.15.0/gcc_64/lib/cmake/Qt5")
set(Qt5Core_DIR "/home/us/qt_5.15c++/5.15.0/gcc_64/lib/cmake/Qt5Core")
set(QT_QMAKE_EXECUTABLE "/home/us/qt_5.15c++/5.15.0/gcc_64/bin/qmake")

set(CMAKE_INCLUDE_CURRENT_DIR ON)

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

#if(CMAKE_VERSION VERSION_LESS "3.7.0")
# set(CMAKE_INCLUDE_CURRENT_DIR ON)
#endif()

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# QtCreator supports the following variables for Android, which are identical to qmake Android variables.
# Check doc.qt.io/qt-5/deployment-android.html for more information.
# They need to be set before the find_package(Qt5 ...) call.

#if(ANDROID)
# set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android")
# if (ANDROID_ABI STREQUAL "armeabi-v7a")
# set(ANDROID_EXTRA_LIBS
# ${CMAKE_CURRENT_SOURCE_DIR}/path/to/libcrypto.so
# ${CMAKE_CURRENT_SOURCE_DIR}/path/to/libssl.so)
# endif()
#endif()

find_package(Qt5 COMPONENTS Widgets REQUIRED)

if(ANDROID)
add_library(untitled1 SHARED
main.cpp
mainwindow.cpp
mainwindow.h
mainwindow.ui
)
else()
add_executable(untitled1
main.cpp
mainwindow.cpp
mainwindow.h
mainwindow.ui
)
endif()

target_link_libraries(untitled1 PRIVATE Qt5::Widgets
${OpenCV_LIBS}
)


.pro
QT += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
main.cpp \
mainwindow.cpp

HEADERS += \
mainwindow.h

FORMS += \
mainwindow.ui

INCLUDEPATH += /usr/local/include/opencv4
LIBS += -L/usr/local/lib -lopencv_core -lopencv_highgui -lopencv_imgproc -lopencv_objdetect -lopencv_imgcodecs -lopencv_videoio
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target


code if needed
#include
#include
using namespace std;
using namespace cv;
// Объявления функций обратного вызова
void cbMouse(int event, int x, int y, int flags, void*);
void tb1_Callback(int value, void *);
void tb2_Callback(int value, void *);
void checkboxCallBack(int state, void *);
void radioboxCallBack(int state, void *id);
void pushbuttonCallBack(int, void *font);
// Глобальные определения и переменные
Mat orig_img, tmp_img;
const char main_win[]="main_win";
char msg[50]="";

int main() {
const char track1[]="TrackBar 1";
const char track2[]="TrackBar 2";
const char checkbox[]="Check Box";
const char radiobox1[]="Radio Box1";
const char radiobox2[]="Radio Box2";
const char pushbutton[]="Push Button";
int tb1_value = 50; // Начальное значение полосы прокрутки 1
int tb2_value = 25; // Начальное значение полосы прокрутки 2
orig_img = imread("/home/us/Рабочий стол/ccc/tut1/1.png"); // Открываем и читаем изображение
if (orig_img.empty()) {
cout << "Ошибка!!! Не удалось загрузить изображение..." << endl;
return -1;
}
namedWindow(main_win); // Создаем главное окно
//// Создаем шрифт для добавления текста поверх изображения
QtFont font = fontQt("Arial", 20, Scalar(255,0,0,0),
QT_FONT_BLACK, QT_STYLE_NORMAL);
// Задаем функции обратного вызова
setMouseCallback(main_win, cbMouse, NULL);
createTrackbar(track1, main_win, &tb1_value, 100, tb1_Callback);
createButton(checkbox, checkboxCallBack, 0, QT_CHECKBOX);
//// Передаем значение (шрифт) функции обратного вызова
createButton(pushbutton, pushbuttonCallBack,
(void *)&font, QT_PUSH_BUTTON);
createTrackbar(track2, "win", &tb2_value,
50, tb2_Callback);

// Передаем значения функциям обратного вызова
createButton(radiobox1, radioboxCallBack,
(void *)radiobox1, QT_RADIOBOX);
createButton(radiobox2, radioboxCallBack,
(void *)radiobox2, QT_RADIOBOX);
imshow(main_win, orig_img); // показываем исходное изображение
cout << "Для выхода нажмите любую клавишу..." << endl;
waitKey(); // Бесконечный цикл обработки событий
return 0;
}

void tb1_Callback(int value, void *) {
sprintf(msg, "Полоса прокрутки 1 изменилась. Новое значение=%d", value);
displayOverlay(main_win, msg);
return;
}
void tb2_Callback(int value, void *) {
sprintf(msg, "Полоса прокрутки 2 изменилась. Новое значение=%d", value);
displayStatusBar(main_win, msg, 1000);
return;
}

void cbMouse(int event, int x, int y, int flags, void*) {
// В статических переменных хранятся значения между вызовами
static Point p1, p2;
static bool p2set = false;
// Нажата левая кнопка мыши
if (event == EVENT_LBUTTONDOWN) {
p1 = Point(x, y); // Точка, в которой произошло событие
p2set = false;
} else if (event == EVENT_MOUSEMOVE &&

flags == EVENT_FLAG_LBUTTON) {
// Перемещение мыши с нажатой левой кнопкой
// Проверяем выход за границы
if (x > orig_img.size().width)
x = orig_img.size().width;
else if (x < 0)
x = 0;
// Проверяем выход за границы
if (y > orig_img.size().height)
y = orig_img.size().height;
else if (y < 0)
y = 0;
p2 = Point(x, y); // Устанавливаем конечную точку
p2set = true;
// Копируем исходное изображение во временное
orig_img.copyTo(tmp_img);
// Рисуем прямоугольник
rectangle(tmp_img, p1, p2, Scalar(0, 0 ,255));
// Показываем временное изображение с прямоугольником
imshow(main_win, tmp_img);
} else if (event == EVENT_LBUTTONUP && p2set) {
// Левая кнопка отпущена в области окна
// Подмассив исходного изображения с выбранным прямоугольником
Mat submat = orig_img(Rect(p1, p2));
// Здесь должен быть код обработки подматрицы
//...
// Отмечаем границы выбранного прямоугольника
rectangle(orig_img, p1, p2, Scalar(0, 0, 255), 2);
imshow("main_win", orig_img);
}
return;
}

void checkboxCallBack(int state, void *) {
sprintf(msg, "Флажок изменился. Новое состояние=%d", state);
displayStatusBar(main_win, msg);
return;
}
void radioboxCallBack(int state, void *id) {
// Ид переключателя передается функции обратного вызова
sprintf(msg, "%s изменился. Новое состояние=%d",
(char *)id, state);
displayStatusBar(main_win, msg);
return;
}
void pushbuttonCallBack(int, void *font) {
// Добавить текст поверх изображения
addText(orig_img, "Нажата кнопка",
Point(50,50), *((QtFont *)font));
imshow(main_win, orig_img); // Показываем исходное изображение
return;
}

Answer the question

In order to leave comments, you need to log in

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question