vs2019 qt c++ 提升控件为自定义类 报错C1083 自定义类是<>包含而非“”包含
时间: 2023-12-07 11:03:17 浏览: 231
如果您在自定义类的头文件中使用了尖括号 `< >` 来引用其他头文件,而不是双引号 `" "`,则编译器可能会将该头文件解释为系统头文件而非当前项目的头文件,从而导致 C1083 错误。
解决方法:
1. 使用双引号 `" "` 来引用当前项目的头文件。
2. 如果必须使用尖括号 `< >`,则可以在头文件引用之前使用 `#include <QtCore/qglobal.h>`,然后使用 `Q_DECL_IMPORT` 或 `Q_DECL_EXPORT` 宏来声明该头文件是当前项目的头文件而非系统头文件。
例如:
```cpp
#include <QtCore/qglobal.h>
#ifndef MYHEADER_H
#define MYHEADER_H
#ifdef MYLIBRARY_EXPORT
#define MYLIBRARY_EXPORT Q_DECL_EXPORT
#else
#define MYLIBRARY_EXPORT Q_DECL_IMPORT
#endif
MYLIBRARY_EXPORT void myFunction();
#endif // MYHEADER_H
```
希望这能够帮助您解决问题。
相关问题
qt c++ mdiarea控件中的子窗口qwidget关闭时 自定义树模型 parent()程序报错
根据你的问题描述,我猜测你在自定义树模型中实现了 `parent()` 函数,并且在子窗口 `QWidget` 关闭时,调用了该函数导致程序报错。
可能的原因是:当一个子窗口关闭时,它的 `QWidget` 对象会被删除,但是树模型中关于该子窗口的节点信息并没有被及时更新,因此在调用 `parent()` 函数时会访问到已经被删除的对象,从而导致程序出错。
解决方法是在子窗口被关闭时,及时更新树模型中的节点信息。你可以在子窗口的关闭事件中发送一个信号,让树模型接收到该信号,并在相应的槽函数中更新节点信息。
示例代码如下:
```
// 子窗口关闭事件
void MyWidget::closeEvent(QCloseEvent *event)
{
emit widgetClosed(this); // 发送关闭信号
QWidget::closeEvent(event);
}
// 树模型中的槽函数
void MyTreeModel::onWidgetClosed(QWidget *widget)
{
// 查找该子窗口对应的节点信息,并从父节点中移除
QModelIndex parentIndex = findIndexForWidget(widget->parentWidget());
if (parentIndex.isValid()) {
int row = findRowForWidget(widget);
beginRemoveRows(parentIndex, row, row);
removeWidgetFromMap(widget);
endRemoveRows();
}
}
```
其中,`findIndexForWidget()` 和 `findRowForWidget()` 函数分别用于查找节点对应的索引和行号,`removeWidgetFromMap()` 函数用于从节点信息映射中移除该子窗口的信息。
resizeEvent报错
非常抱歉,我的回答依然有误。`QGraphicsView`并没有`resizeEvent`事件,正确的方法是重写`QGraphicsView`的`resizeEvent`方法。下面是修改后的代码:
```c++
// 创建图片对象
QPixmap qImgSrc = QPixmap::fromImage(QImage(imgsrc.data, imgsrc.cols, imgsrc.rows, QImage::Format_RGB888));
QPixmap qImgBin = QPixmap::fromImage(QImage(imgthreshold.data, imgthreshold.cols, imgthreshold.rows, QImage::Format_RGB888));
// 创建场景对象
QGraphicsScene scene1, scene2;
// 创建图片项并添加到场景中
QGraphicsPixmapItem item1(qImgSrc);
QGraphicsPixmapItem item2(qImgBin);
scene1.addItem(&item1);
scene2.addItem(&item2);
// 设置场景
ui.graphSrc->setScene(&scene1);
ui.graphBin->setScene(&scene2);
// 重写QGraphicsView的resizeEvent方法
class MyGraphicsView1 : public QGraphicsView {
public:
MyGraphicsView1(QGraphicsScene *scene, QWidget *parent = nullptr) : QGraphicsView(scene, parent) {}
protected:
void resizeEvent(QResizeEvent *event) override {
QGraphicsView::resizeEvent(event);
item1.setPixmap(qImgSrc.scaled(size(), Qt::KeepAspectRatio, Qt::SmoothTransformation));
}
private:
QGraphicsPixmapItem item1;
QPixmap qImgSrc;
};
class MyGraphicsView2 : public QGraphicsView {
public:
MyGraphicsView2(QGraphicsScene *scene, QWidget *parent = nullptr) : QGraphicsView(scene, parent) {}
protected:
void resizeEvent(QResizeEvent *event) override {
QGraphicsView::resizeEvent(event);
item2.setPixmap(qImgBin.scaled(size(), Qt::KeepAspectRatio, Qt::SmoothTransformation));
}
private:
QGraphicsPixmapItem item2;
QPixmap qImgBin;
};
// 创建自定义的QGraphicsView并设置到UI界面
MyGraphicsView1 *graphSrc = new MyGraphicsView1(&scene1);
MyGraphicsView2 *graphBin = new MyGraphicsView2(&scene2);
ui.verticalLayout->addWidget(graphSrc);
ui.verticalLayout->addWidget(graphBin);
```
上述代码中,我们创建了两个继承自`QGraphicsView`的子类`MyGraphicsView1`和`MyGraphicsView2`,并重写了`resizeEvent`方法。在方法中,我们先调用父类的`resizeEvent`方法,再通过调用`setPixmap`方法设置图片的大小,使其与控件大小保持一致,并保持图片的长宽比例不变。
最后,我们将自定义的`MyGraphicsView1`和`MyGraphicsView2`添加到UI界面中。注意,我们需要将`QGraphicsPixmapItem`对象作为`MyGraphicsView1`和`MyGraphicsView2`的成员变量来进行访问。
阅读全文