0

我敢肯定这可能很简单。我整天都在努力寻找解决方案,但我做不到。请帮帮我!

Qt Creator 4.15.1、MinGW 8.1.0 64-bit for C++、CMake 3.19.2(使用 Cmake 是先决条件) Error_screen

我认为错误是我错误地连接了库 Qt6AxContainer.lib。

CMakeLists.txt

cmake_minimum_required(VERSION 3.5)

project(HeatMap2 VERSION 0.1 LANGUAGES CXX)

set(CMAKE_INCLUDE_CURRENT_DIR ON)

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

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 https://doc.qt.io/qt/deployment-android.html for more information.
# They need to be set before the find_package( ...) calls below.

#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(QT NAMES Qt6 Qt5 COMPONENTS Widgets REQUIRED)
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Widgets REQUIRED)
find_package(Qt6 COMPONENTS AxContainer REQUIRED)


add_library(obj D:/Qt/6.1.2/msvc2019_64/lib/Qt6AxContainer.lib)
target_link_libraries(obj PRIVATE Qt6::AxContainer)


set(PROJECT_SOURCES
        main.cpp
        widget.cpp
        widget.h
        widget.ui
)

if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
    qt_add_executable(HeatMap2
        MANUAL_FINALIZATION
        ${PROJECT_SOURCES}
    )
else()
    if(ANDROID)
        add_library(HeatMap2 SHARED
            ${PROJECT_SOURCES}
        )
    else()
        add_executable(HeatMap2
            ${PROJECT_SOURCES}
        )
    endif()
endif()

target_link_libraries(HeatMap2 PRIVATE Qt${QT_VERSION_MAJOR}::Widgets)

set_target_properties(HeatMap2 PROPERTIES
    MACOSX_BUNDLE_GUI_IDENTIFIER my.example.com
    MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
    MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
)

if(QT_VERSION_MAJOR EQUAL 6)
    qt_finalize_executable(HeatMap2)
endif()

widjet.cpp

#include "widget.h"
#include "./ui_widget.h"
#include <QtGui>
#include <ActiveQt/qaxobject.h>
#include <ActiveQt/qaxbase.h>
#include <QTableWidget>

QString file("D:\\Programs\\123.xlsx");

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    connect(ui->pushButton, &QPushButton::clicked, this, &Widget::readExcel);

}

Widget::~Widget()
{
    delete ui;
}



void Widget::readExcel()
{
    QAxObject* excel = new QAxObject("Excel.Application", this);
    QAxObject* workbooks = excel->querySubObject("Workbooks");
    QAxObject* workbook = workbooks->querySubObject("Open(const QString&)", file);
    excel->dynamicCall("SetVisible(bool", false);

    QAxObject* worksheet = workbook->querySubObject("Worksheets(int)", 1);

    QAxObject* usedrange = worksheet->querySubObject("UsedRange");
    QAxObject* rows = usedrange->querySubObject("Rows");
    QAxObject* columns = usedrange->querySubObject("Columns");

    int intRowStart = usedrange->property("Row").toInt();
    int intColStart = usedrange->property("Columns").toInt();
    int intCols = columns->property("Count").toInt();
    int intRows = rows->property("Count").toInt();

    qDebug()<<intRows;
    qDebug()<<intCols;

    ui->tableWidget->setRowCount(intRowStart + intRows);
    ui->tableWidget->setColumnCount(intColStart + intCols);

    for ( int row = 0; row < intRows; row++ ){
        for ( int col = 0; col < intCols; col++ ){
            QAxObject* cell = worksheet->querySubObject("Cells(int,int)", col + 1, row + 1);
            QVariant value = cell->dynamicCall("Value()");
            QTableWidgetItem* item = new QTableWidgetItem(value.toString());
            ui->tableWidget->setItem(row, col, item);
        }
    }

    workbook->dynamicCall("Close");
    excel->dynamicCall("Quit()");
}

我做了一些更改,但结果是一样的: 在此处输入图像描述

add_library(widget widget.cpp ${Cmake_hdr_moc} ${Cmake_form_hdr})
target_link_libraries (widget Qt6::Widgets)

add_executable(heatmap main.cpp)
target_link_libraries(heatmap widget)

add_library(obj D:/Qt/6.1.2/msvc2019_64/lib/Qt6AxContainer.lib)
target_link_libraries(heatmap Qt6::AxContainer)
cmake_minimum_required(VERSION 3.5)

project(HeatMap2 VERSION 0.1 LANGUAGES CXX)

set(CMAKE_INCLUDE_CURRENT_DIR ON)

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

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)


find_package(QT NAMES Qt6 Qt5 COMPONENTS Widgets REQUIRED)
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Widgets REQUIRED)
find_package(Qt6 COMPONENTS AxContainer REQUIRED)

set(PROJECT_SOURCES
        main.cpp
        widget.cpp
        widget.h
        widget.ui
)

if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
    qt_add_executable(HeatMap2
        MANUAL_FINALIZATION
        ${PROJECT_SOURCES}
    )
else()
    if(ANDROID)
        add_library(HeatMap2 SHARED
            ${PROJECT_SOURCES}
        )
    else()
        add_executable(HeatMap2
            ${PROJECT_SOURCES}
        )
    endif()
endif()

target_link_libraries(HeatMap2 PRIVATE Qt${QT_VERSION_MAJOR}::Widgets)

#=======================================================
target_link_libraries(HeatMap2 PRIVATE Qt6::AxContainer)
#=======================================================

set_target_properties(HeatMap2 PROPERTIES
    MACOSX_BUNDLE_GUI_IDENTIFIER my.example.com
    MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
    MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
)

if(QT_VERSION_MAJOR EQUAL 6)
    qt_finalize_executable(HeatMap2)
endif()
4

1 回答 1

0

我附上一个工作的 CMakeLists.txt

cmake_minimum_required(VERSION 3.5)

project(HeatMap2 VERSION 0.1 LANGUAGES CXX)

set(CMAKE_INCLUDE_CURRENT_DIR ON)

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

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)


find_package(QT NAMES Qt6 Qt5 COMPONENTS Widgets REQUIRED)
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Widgets REQUIRED)
find_package(Qt6 COMPONENTS AxContainer REQUIRED)

set(PROJECT_SOURCES
        main.cpp
        widget.cpp
        widget.h
        widget.ui
)

if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
    qt_add_executable(HeatMap2
        MANUAL_FINALIZATION
        ${PROJECT_SOURCES}
    )
else()
    if(ANDROID)
        add_library(HeatMap2 SHARED
            ${PROJECT_SOURCES}
        )
    else()
        add_executable(HeatMap2
            ${PROJECT_SOURCES}
        )
    endif()
endif()

target_link_libraries(HeatMap2 PRIVATE Qt${QT_VERSION_MAJOR}::Widgets)

#=======================================================
target_link_libraries(HeatMap2 PRIVATE Qt6::AxContainer)
#=======================================================

set_target_properties(HeatMap2 PROPERTIES
    MACOSX_BUNDLE_GUI_IDENTIFIER my.example.com
    MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
    MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
)

if(QT_VERSION_MAJOR EQUAL 6)
    qt_finalize_executable(HeatMap2)
endif()

我添加的代码:

target_link_libraries(HeatMap2 PRIVATE Qt6::AxContainer)

您已将此调用放在创建 HeatMap2 目标的行之后,不是吗?目标由 add_library 或 add_executable 调用创建,目标的名称等于此类调用的第一个参数。

感谢 Tsyvarev 的帮助!

于 2021-07-12T09:13:26.160 回答