gpt4 book ai didi

c++ - 重构后Qt无法解析的外部符号

转载 作者:行者123 更新时间:2023-11-28 06:47:10 25 4
gpt4 key购买 nike

我有一个正常工作的带有自定义小部件的 Qt 代码。然后我折射出一个信号名称并立即撤消操作。从那时起我得到了-

mainwindow.obj:-1: error: LNK2001: unresolved external symbol "protected: virtual void
__thiscall QWidget::mouseDoubleClicked(class QMouseEvent *)"
?mouseDoubleClicked@QWidget@@MAEXPAVQMouseEvent@@@Z)

mouseDoubleClicked 是 wmits 折射信号的方法。虽然我撤消了折射操作,但它仍然给出了这个错误。相同的代码确实运行了。

我试过清理和运行 qMake 但没有成功。即使创建了一个新项目并复制粘贴了文件内容,但仍然出现相同的错误。

这些是文件-

主窗口.h

#pragma once;


#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();

private:
Ui::MainWindow *ui;
};

myqtimagewidget.h

#pragma once
#include <QWidget>
#include <QImage>
#include <QPainter>
#include <QtGui/QMouseEvent>
#include "opencv2/opencv.hpp"

class MyQtImageWidget : public QWidget
{
Q_OBJECT

protected:
QImage qimage;
cv::Mat temp;

void paintEvent(QPaintEvent*);
void mouseDoubleClicked(QMouseEvent* event);
// void mousePressEvent(QMouseEvent *event);

public:
explicit MyQtImageWidget(QWidget *parent = 0) : QWidget(parent) {}
QSize sizeHint() const {return qimage.size(); }
QSize minimumSizeHint() const {return qimage.size(); }


signals:
void signalMouseMoved(QString);

public slots:
void showImage(const cv::Mat &image);

};

myqtimagewidget.cpp

#include "myqtimagewidget.h"
#include "opencv2/opencv.hpp"

using namespace cv;

void MyQtImageWidget::showImage(const Mat &image)
{
//resize image to fit widget. Maintains aspect ratio

int width = this->maximumWidth();
int hight = this->maximumHeight();

Mat rescaledImg;

if(image.cols > width || image.rows > hight)
{
// debug info --v
QString data = "Original dimention: " + QString::number(image.cols) + "x" + QString::number(image.rows);
qDebug(data.toStdString().c_str());
// debug info --^

double aspectRatio = (double)image.cols / (double)image.rows; // width / height
cv::Size2i newSize;

// debug info --v
qDebug(std::to_string(width).c_str());
qDebug(std::to_string(hight).c_str());
// debug info --^

if(image.cols >= image.rows)
{
newSize = cv::Size(width, width / aspectRatio);
}
else
{
newSize = cv::Size(hight * aspectRatio, hight);
}

cv::resize(image, rescaledImg, newSize, 1, 1);

// debug info --v
data = "Resized dimention: " + QString::number(rescaledImg.cols) + "x" + QString::number(rescaledImg.rows);
qDebug(data.toStdString().c_str());
// debug info --^
}
else
rescaledImg = image;

// Convert the image to the RGB888 format
switch (rescaledImg.type())
{
case CV_8UC1:
cvtColor(rescaledImg, temp, CV_GRAY2RGB);
break;
case CV_8UC3:
cvtColor(rescaledImg, temp, CV_BGR2RGB);
break;
}

// QImage needs the data to be stored continuously in memory
assert(temp.isContinuous());
// Assign OpenCV's image buffer to the QImage. Note that the bytesPerLine parameter
// (http://qt-project.org/doc/qt-4.8/qimage.html#QImage-6) is 3*width because each pixel
// has three bytes.
qimage = QImage(temp.data, temp.cols, temp.rows, temp.cols*3, QImage::Format_RGB888);

repaint();
}

void MyQtImageWidget::paintEvent(QPaintEvent *event)
{
// Display the image
QPainter painter(this);

painter.drawImage(QPoint(0,0), qimage);
painter.end();
}

void MyQtImageWidget::mouseDoubleClicked(QMouseEvent *event)
{
int x = event->pos().x(), y = event->pos().y();

QString data = "x: " + QString::number(x) + ", y: " + QString::number(y);

emit MyQtImageWidget::signalMouseMoved(data);
}

主窗口.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "opencv2/opencv.hpp"
#include "myqtimagewidget.h"

using namespace cv;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);

QString imageSrc = "E:\\Images\\Panorama\\Harshil3578_stitch.jpg";
Mat image = imread(imageSrc.toStdString(), IMREAD_COLOR);



}

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

在 GUI 中,我将一个小部件提升为 MyQtImageWidget 并连接到 QLabel。

最佳答案

考虑链接器告诉您的内容:

  • QWidget 有一个名为 mouseDoubleClicked 的虚方法。
  • 该方法未实现。

问题是 QWidget 没有有一个名为 mouseDoubleClicked 的虚方法。我最好的猜测是,在重构期间,您以某种方式修改了 QWidget 的头文件,将现有的虚函数重命名为 mouseDoubleClicked。

如果是这种情况,获取 qwidget.h 的新拷贝(或重新安装 Qt)应该可以解决问题。

关于c++ - 重构后Qt无法解析的外部符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24755966/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com