error: LNK2001: 无法解析的外部符号 “public: virtual struct QMetaObject const * __cdecl

Qt系列文章目录

文章目录

  • Qt系列文章目录
  • 前言
  • 一、QtCreator中qmake命令是什么?
  • 2.解决

前言

我在代码中加入了对应的信号和槽,但编译仍然报错:

#ifndef PROJECTWIN_H
#define PROJECTWIN_H



namespace Ui {
class ProjectWin;
}


ProjectWin类声明头文件
class ProjectWin : public QWidget
{
    Q_OBJECT
public:
    static ProjectWin* getInstance();
    ~ProjectWin();

    FileMonitorMgr *m_fileMgr;
    QString m_paraFolder;
private:
    QTreeWidget* m_picTree;
//    QTreeWidget* m_paraTree;
    QWidget* m_naviWgt;

private:
    void initWidget();
    void initPicTree();
    void readParaFile(QString filePath);
private:
   
    QTextEdit*  m_paraText;
   

    static ProjectWin* m_pInstance;
private:
    explicit ProjectWin(QWidget *parent = nullptr);
    static void destroyInstance();

public Q_SLOTS:
   
    void slotParaInfo(QString imageName);
};

#endif // PROJECTWIN_H

ProjectWin类实现
#include "ProjectWin.h"
#include "ui_ProjectWin.h"

#pragma execution_character_set("utf-8")


ProjectWin* ProjectWin::m_pInstance = nullptr;

ProjectWin* ProjectWin::getInstance()
{
    if(!m_pInstance)
    {
        m_pInstance = new ProjectWin();
        atexit(destroyInstance);
    }
    return m_pInstance;
}

void ProjectWin::destroyInstance()
{
    if(m_pInstance)
    {
        delete m_pInstance;
        m_pInstance = nullptr;
    }
}

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

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

 

    //图像参数
    m_tabWidgetPara = new QTabWidget();
    m_paraText = new QTextEdit();
    m_tabWidgetPara->addTab(m_paraText, u8"图像参数数据");
    m_tabWidgetPara->setStyleSheet("border: 0");
    m_paraText->setStyleSheet("border: 0");

//    m_tabWidgetPara->setTabText(0, u8"图像参数数据");

   
    // 设置窗口的主布局
   
    this->setLayout(mainLayout);
}

void ProjectWin::onItemClicked(QTreeWidgetItem *item, int column)
{
    QString imageName = item->text(0);
    emit sigShowImageBorder(imageName);
}

void ProjectWin::initWidget()
{

    //    m_picTree->header()->hide();//设置隐藏头
}


void ProjectWin::slotParaInfo(QString imageName)
{
    QString fullPath = m_paraFolder + "/";
    QDir directory(m_paraFolder);
    QStringList filters;
    filters << "*.txt";

    directory.setNameFilters(filters);
    directory.setFilter(QDir::Files | QDir::NoDotAndDotDot);

    QFileInfoList fileInfoList = directory.entryInfoList();
    for (const QFileInfo &fileInfo : fileInfoList) {
        //        qDebug() << "Found:" << fileInfo.absoluteFilePath();
        QString fullPath = fileInfo.absoluteFilePath();
        if(imageName == fileInfo.fileName())
        {
            fullPath += imageName;
            readParaFile(m_paraFolder);
        }
    }
}

GraphicsView类实现实现
#ifndef GRAPHICSVIEW_H
#define GRAPHICSVIEW_H

#include <QtWidgets>
#include <QGraphicsView>
#include "GraphicsScene.h"
#include "GraphicsItem.h"

//#include <QGraphicViewMouseEvent>

class GraphicsScene;

class GraphicsView : public QGraphicsView
{
    Q_OBJECT
public:
    GraphicsView(QWidget *parent = nullptr)
    {


    }

protected:
    void mousePressEvent(QMouseEvent *event) override
    {
        if (event->button() == Qt::LeftButton && event->modifiers() == Qt::ControlModifier) {
            m_isMousePressed = true;
            m_lastMousePos = event->pos();
            setCursor(Qt::ClosedHandCursor);
        } else {
            if (event->button() == Qt::LeftButton) {
                QGraphicsItem *item = itemAt(event->pos());
                if(item)
                {
                    GraphicsItem* selectedItem = dynamic_cast<GraphicsItem*>(item);
                    if(selectedItem)
                    {
                        QString imageName = selectedItem->getImageName();
                        emit imageNameSelected(imageName);
                    }
                }
                setDragMode(RubberBandDrag);
                pressPosition = event->pos();
                m_startScenePos = mapToScene(event->pos());
                m_rubberBandDragging = true;
                m_multipleItemsSelected = (scene()->selectedItems().size() > 1);
            }
            QGraphicsView::mousePressEvent(event);
        }
    }

private:
    
Q_SIGNALS:
    void imageNameSelected(QString imageName);
};

#endif // GRAPHICSVIEW_H


ImageManager类定义
#ifndef IMAGEMANAGER_H
#define IMAGEMANAGER_H

#include <QWidget>
#include <QVector>
#include <QImage>
#include <QVBoxLayout>
#include "GraphicsItem.h"
#include "GraphicsView.h"
#include "GraphicsScene.h"
#include "ProjectWin.h"

class ImageManager : public QWidget
{
    Q_OBJECT
public:
    explicit ImageManager(/*ProjectWin* projectWin,*/QWidget *parent = nullptr);

private:
    GraphicsScene* m_scene;
    GraphicsView*  m_view;
    GraphicsItem*  m_item;
    QVector<GraphicsItem*> m_items;
    QVBoxLayout*   m_layout;

    QString m_watchPath;

//    ProjectWin* m_projectWin;
public Q_SLOTS:
    void setImagePosition(QVector<QString> &filesVec, QString &path, int groupType);

Q_SIGNALS:

};

#endif // IMAGEMANAGER_H


#include "ImageManager.h"
#include "ProjectWin.h"
#include <QMetaObject>

ImageManager::ImageManager(/*ProjectWin* projectWin,*/QWidget* parent)
    : QWidget(parent)/*, m_projectWin(projectWin)*//*, m_scene(new GraphicsScene(this)), m_view(new GraphicsView()), m_layout(new QVBoxLayout(this))*/ {

    m_scene = new GraphicsScene(this);
	m_view = new GraphicsView;

    


    m_layout = new QVBoxLayout(this);
    m_layout->addWidget(m_view);
	setLayout(m_layout);

    int winWidth = 2048;  //1642
    int winHeight = 1050;   //692
//    setFixedSize(winWidth, winHeight);
    resize(winWidth, winHeight);

	
    connect(m_view, &GraphicsView::imageNameSelected, ProjectWin::getInstance(), &ProjectWin::slotParaInfo);

}

ImageManager.obj👎 error: LNK2001: 无法解析的外部符号 "public: virtual struct QMetaObject const * __cdecl GraphicsView::metaObject(void)const " (?metaObject@GraphicsView@@UEBAPEBUQMetaObject@@XZ)
ImageManager.obj👎 error: LNK2001: 无法解析的外部符号 “public: virtual void * __cdecl GraphicsView::qt_metacast(char const *)” (?qt_metacast@GraphicsView@@UEAAPEAXPEBD@Z)
ImageManager.obj👎 error: LNK2001: 无法解析的外部符号 “public: virtual int __cdecl GraphicsView::qt_metacall(enum QMetaObject::Call,int,void * *)” (?qt_metacall@GraphicsView@@UEAAHW4Call@QMetaObject@@HPEAPEAX@Z)
ImageManager.obj👎 error: LNK2019: 无法解析的外部符号 “public: void __cdecl GraphicsView::imageNameSelected(class QString)” (?imageNameSelected@GraphicsView@@QEAAXVQString@@@Z),函数 “public: __cdecl ImageManager::ImageManager(class QWidget *)” (??0ImageManager@@QEAA@PEAVQWidget@@@Z) 中引用了该符号
debug\ImageManageSys.exe👎 error: LNK1120: 5 个无法解析的外部命令

一、QtCreator中qmake命令是什么?

qmake是一个跨平台的项目文件生成工具,它由Qt开发并维护。它的主要任务是读取你的项目文件(通常是.pro文件),并生成相应的Makefile或其他构建系统的配置文件。这些生成的配置文件可以被make或其他构建工具用来编译和链接你的Qt应用程序或库。

主要的作用如下:

生成构建配置文件:qmake读取.pro项目文件,生成对应平台或编译系统的构建配置文件(如Makefile,或者其他如Visual Studio项目文件)。

处理Qt特有的构建任务:qmake能处理Qt的一些特有的构建任务,如处理Qt的资源文件(.qrc)、用户界面文件(.ui)和处理为了实现Qt元对象系统而需要的moc(元对象编译器)文件。

跨平台兼容性:qmake可以生成不同平台和不同编译系统的构建配置文件,这使得Qt能够跨平台使用。你可以在一个平台上编写.pro文件,然后在其他平台上使用qmake来生成对应的构建配置文件。

使用qmake的基本步骤通常是:

编写一个.pro文件,描述项目的源文件、头文件、资源文件、需要的Qt模块等信息。
在命令行中运行qmake命令,根据.pro文件生成构建配置文件(如Makefile)。
运行make(或其他编译工具,如nmake、jom等)来编译和链接程序。
在Qt Creator中,这些步骤通常会被自动执行。当你修改.pro文件或者需要重新生成构建配置文件时,可以在Qt Creator中手动运行qmake。

2.解决

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/20100.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

杂记——24.HTML中空格的写法

前几天写项目时&#xff0c;突然对HTML中空格的写法感兴趣&#xff0c;于是搜了一下&#xff0c;现在对其进行总结 HTML不是一种编程语言&#xff0c;而是一种超文本标记语言 (markup language)&#xff0c;是网页制作所必备的。超文本”就是指页面内可以包含图片、链接&#…

创建基于oracle jdk8的自定义docker镜像

创建基于oracle jdk8的自定义docker镜像 1:查看服务器java版本&#xff1a; 如果服务器的版本是open-jdk&#xff0c;则进行如下操作 拷贝相关jdk压缩包&#xff08;.tar.gz后缀&#xff09;到服务器目录&#xff08;例&#xff1a;/usr/local&#xff09; 解压&#xff1a;…

【18】SCI易中期刊推荐——计算机科学(中科院2区)

💖💖>>>加勒比海带,QQ2479200884<<<💖💖 🍀🍀>>>【YOLO魔法搭配&论文投稿咨询】<<<🍀🍀 ✨✨>>>学习交流 | 温澜潮生 | 合作共赢 | 共同进步<<<✨✨ 📚📚>>>人工智能 | 计算机视觉…

你真的会跟 ChatGPT 聊天吗?(下)

接《你真的会跟 ChatGPT 聊天吗&#xff1f;&#xff08;上&#xff09;》&#xff0c;本文下半部分没有无毛猫那么搞笑的内容啦&#xff01;即使如此&#xff0c;哪怕你对文中提及的技术不大了解&#xff0c;也可以毫无压力地看完这篇&#xff0c;描述如何更好地获得 ChatGPT …

Redis数据结构——动态字符串、Dict、ZipList

一、Redis数据结构-动态字符串 我们都知道Redis中保存的Key是字符串&#xff0c;value往往是字符串或者字符串的集合。可见字符串是Redis中最常用的一种数据结构。 不过Redis没有直接使用C语言中的字符串&#xff0c;因为C语言字符串存在很多问题&#xff1a; 获取字符串长度…

基于Python的学生成绩管理系统

末尾获取源码 开发语言&#xff1a;python 后端框架&#xff1a;django 数据库&#xff1a;MySQL5.7 开发软件&#xff1a;Pycharm 是否Maven项目&#xff1a;是 目录 一、项目简介 二、系统功能 三、系统项目截图 四、核心代码 4.1登录相关 4.2文件上传 4.3封装 一、项…

《程序员面试金典(第6版)》面试题 16.19. 水域大小(深度优先搜索,类似棋盘类问题,八皇后的简化版本,C++)

题目描述 你有一个用于表示一片土地的整数矩阵land&#xff0c;该矩阵中每个点的值代表对应地点的海拔高度。若值为0则表示水域。由垂直、水平或对角连接的水域为池塘。池塘的大小是指相连接的水域的个数。编写一个方法来计算矩阵中所有池塘的大小&#xff0c;返回值需要从小到…

【下载】【you-get】用电脑下载网页视频

分享一下&#xff0c;此方法是在网络上看到的&#xff0c;但忘了出处。 一、前提 电脑安装了python软件&#xff0c;版本无要求。建议上官网下载软件。记得配置好环境&#xff08;将pyhton的scripts文件夹的路径加到用户变量里&#xff09;。 二、方法 1、安装you-get库 &am…

Java8之Stream操作

Java8之Stream操作 stream干啥用的&#xff1f;创建流中间操作终结操作好文推荐----接口优化思想 stream干啥用的&#xff1f; Stream 就是操作数据用的。使用起来很方便 创建流 → 中间操作 → 终结操作 Stream的操作可以分为两大类&#xff1a;中间操作、终结操作 中间操作可…

前端自学好还是培训好?女生有多适合学前端,我来告诉你!

2023年了&#xff0c;你是否还在迷茫或者每个月拿着5/6k做着卷死的工作&#xff0c;不但存不下钱还不能好好享受生活&#xff0c;如果是&#xff0c;那你真该考虑一下转行了。 好程序员先说说前端到底怎么开始学&#xff1a; 有的伙伴说今年28岁了&#xff0c;学的会计&#xf…

Java --- redis7之布隆过滤器BloomFilter

目录 一、布隆过滤器BloomFilter 1.1、面试题 1.2、 布隆过滤器简介 1.2.1、设计思想 1.3、特点 1.4、布隆过滤器原理 1.4.1、实现原理与数据结构 1.4.2、添加key、查询key 1.4.3、hash冲突导致数据不精准 1.4.4、三步骤 1.4.5、布隆过滤器误判&#xff0c;为什么不…

xormplus是xorm的增强版,为xorm提供类似ibatis的配置文件及动态SQL支持

简介 xorm是一个简单而强大的Go语言ORM库&#xff0c;通过它可以使数据库操作非常简便。本库是基于原版xorm的定制增强版本&#xff0c;为xorm提供类似ibatis的配置文件及动态SQL支持&#xff0c;支持AcitveRecord操作。 github地址:https://github.com/armingli/xorm //安装…

FE_Vue学习笔记 条件渲染[v-show v-if] 列表渲染[v-for] 列表过滤 列表排序

1 条件渲染 v-show v-if 使用template可以使其里面的内容在html的结构中不变。条件渲染&#xff1a; v-if 1&#xff09;v-if“表达式” 2&#xff09;v-else-if“表达式” 3&#xff09;v-else {} 适用于&#xff1a;切换频率较低的场景。特点&#xff1a;不展示的DOM元素直…

( 位运算 ) 231. 2 的幂 / 342. 4的幂 ——【Leetcode每日一题】

❓题目一 231. 2 的幂 难度&#xff1a;简单 给你一个整数 n&#xff0c;请你判断该整数是否是 2 的幂次方。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 如果存在一个整数 x 使得 n 2 x n 2^x n2x &#xff0c;则认为 n 是 2 的幂次方。 …

智慧档案馆建设之八防十防常用的设备

档案八防十防常用的十款设备 序号 名称 1 温湿度传感器 2 空气质量云测仪 3 恒湿净化一体机 4 健康防护一体机 5 综合智能触摸一体化区域控制器 6 空调红外学习控制模块 7 漏水检测控制器及感应线 8 数字烟雾传感器 9 红外防盗传感器 10 系统软件平台 附…

连接器:一种可靠耐用、节约成本的同为科技(TOWE)工业连接器

随着我国经济建设水平的飞速发展&#xff0c;工业连接器被广泛应用于工业、化工、机场、船舶、码头、建筑、铁路、医疗、会展、商业演出等领域。工业连接器的作用是用于连接一个电路导体与另一个电路导体、或一个传输元件与另一个传输元件的装置&#xff0c;并且为两个电路子系…

涅槃重生,BitKeep如何闯出千万用户新起点

在全球&#xff0c;BitKeep钱包现在已经有超过千万用户在使用。 当我得知这个数据的时候&#xff0c;有些惊讶&#xff0c;也有点意料之中。关注BitKeep这几年&#xff0c;真心看得出这家公司的发展之迅速。还记得2018年他们推出第一个版本时&#xff0c;小而美&#xff0c;简洁…

Java每日一练(20230513) 输出最值、盛水容器、旋转数组II

目录 1. 输出最值 ※ 2. 盛最多水的容器 &#x1f31f;&#x1f31f; 3. 搜索旋转排序数组 II &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 输出最值…

阿里云备案服务码是什么?备案服务码申请及限制说明

阿里云备案服务码是什么&#xff1f;ICP备案服务码怎么获取&#xff1f;阿里云备案服务码分为免费和付费两种&#xff0c;申请备案服务码是有限制条件的&#xff0c;需要你的阿里云账号下有可用于申请备案服务码的云产品&#xff0c;如云服务器、建站产品、虚拟主机等&#xff…

LDAP配置与安装

LDAP配置与安装 一、安装LDAP1、安装OpenLDAP及相关依赖包2、查看OpenLDAP版本3、配置OpenLDAP数据库4、设置OpenLDAP的管理员密码5、修改配置文件5.1. 修改{2}hdb.ldif文件5.2. 修改{1}monitor.ldif文件5.3. 修改{-1}frontend.ldif文件 6、验证LDAP的基本配置7、修改LDAP文件权…