如何在 qt 表单设计器中的小部件中显示两个不同的 类
How to display two different classes in a widgets in qt form designer
我有一个带有两个小部件的表单。我想使用 QSvgRenderer 在每个小部件中显示不同的 svg 图像。我有两个不同的 classes 可以显示 svg 图像,但是一旦我将两个 classes 提升到两个小部件,我就会收到此错误 ->
但是,如果我只将一个 class 提升到一个小部件,或者将相同的 class 提升到两个小部件,则一切正常,我不会出错。不知何故,第二个 class 杀死了另一个。但我不明白我到底做错了什么。
displaychart.h:
#ifndef DISPLAYWIDGET_H
#define DISPLAYWIDGET_H
#include <QColor>
#include <QHash>
#include <QWidget>
//! [DisplayWidget class definition]
class displaychart : public QWidget
{
Q_OBJECT
public:
displaychart(QWidget *parent = 0);
void paint(QPainter &painter);
public slots:
protected:
void paintEvent(QPaintEvent *event) override;
private:
};
#endif
和displaychart.cpp:
#include <QtWidgets>
#include "displaychart.h"
#include <QSvgRenderer>
displaychart::displaychart(QWidget *parent)
: QWidget(parent)
{
}
void displaychart::paintEvent(QPaintEvent * /* event */)
{
//Create qpainter object
QPainter painter(this);
// file location main wheel in qstring
QString svgFile = "/home/arjan/qtprojects/astro/AstroQt/svg/natalwheel.svg";
// create svg object
QSvgRenderer svgr(svgFile);
// Render paint object
svgr.render(&painter);
// end paint
painter.end();
}
另一个class完全一样。仅重命名函数名和文件名。
displayaspect.h:
#ifndef DISPLAYWIDGET_H
#define DISPLAYWIDGET_H
#include <QColor>
#include <QHash>
#include <QWidget>
//! [DisplayWidget class definition]
class displayaspect : public QWidget
{
Q_OBJECT
public:
displayaspect(QWidget *parent = 0);
void paint(QPainter &painter);
public slots:
protected:
void paintEvent(QPaintEvent *event) override;
private:
};
#endif
和displayaspect.cpp:
#include <QtWidgets>
#include "displayaspect.h"
#include <QSvgRenderer>
displayaspect::displayaspect(QWidget *parent)
: QWidget(parent)
{
}
void displayaspect::paintEvent(QPaintEvent * /* event */)
{
//Create qpainter object
QPainter painter(this);
// file location main wheel in qstring
QString svgFile = "/home/arjan/qtprojects/astro/AstroQt/svg/natalaspect.svg";
// create svg object
QSvgRenderer svgr(svgFile);
// Render paint object
svgr.render(&painter);
// end paint
painter.end();
}
您的问题很可能是 displaychart.h
文件的 include guard。
尝试更改以下...
#ifndef DISPLAYWIDGET_H
#define DISPLAYWIDGET_H
...进入
#ifndef DISPLAYCHART_H
#define DISPLAYCHART_H
通过在两个文件中使用相同的包含防护,您可以有效地防止编译器看到第二个 class,从而导致您看到的错误。
我有一个带有两个小部件的表单。我想使用 QSvgRenderer 在每个小部件中显示不同的 svg 图像。我有两个不同的 classes 可以显示 svg 图像,但是一旦我将两个 classes 提升到两个小部件,我就会收到此错误 ->
但是,如果我只将一个 class 提升到一个小部件,或者将相同的 class 提升到两个小部件,则一切正常,我不会出错。不知何故,第二个 class 杀死了另一个。但我不明白我到底做错了什么。
displaychart.h:
#ifndef DISPLAYWIDGET_H
#define DISPLAYWIDGET_H
#include <QColor>
#include <QHash>
#include <QWidget>
//! [DisplayWidget class definition]
class displaychart : public QWidget
{
Q_OBJECT
public:
displaychart(QWidget *parent = 0);
void paint(QPainter &painter);
public slots:
protected:
void paintEvent(QPaintEvent *event) override;
private:
};
#endif
和displaychart.cpp:
#include <QtWidgets>
#include "displaychart.h"
#include <QSvgRenderer>
displaychart::displaychart(QWidget *parent)
: QWidget(parent)
{
}
void displaychart::paintEvent(QPaintEvent * /* event */)
{
//Create qpainter object
QPainter painter(this);
// file location main wheel in qstring
QString svgFile = "/home/arjan/qtprojects/astro/AstroQt/svg/natalwheel.svg";
// create svg object
QSvgRenderer svgr(svgFile);
// Render paint object
svgr.render(&painter);
// end paint
painter.end();
}
另一个class完全一样。仅重命名函数名和文件名。
displayaspect.h:
#ifndef DISPLAYWIDGET_H
#define DISPLAYWIDGET_H
#include <QColor>
#include <QHash>
#include <QWidget>
//! [DisplayWidget class definition]
class displayaspect : public QWidget
{
Q_OBJECT
public:
displayaspect(QWidget *parent = 0);
void paint(QPainter &painter);
public slots:
protected:
void paintEvent(QPaintEvent *event) override;
private:
};
#endif
和displayaspect.cpp:
#include <QtWidgets>
#include "displayaspect.h"
#include <QSvgRenderer>
displayaspect::displayaspect(QWidget *parent)
: QWidget(parent)
{
}
void displayaspect::paintEvent(QPaintEvent * /* event */)
{
//Create qpainter object
QPainter painter(this);
// file location main wheel in qstring
QString svgFile = "/home/arjan/qtprojects/astro/AstroQt/svg/natalaspect.svg";
// create svg object
QSvgRenderer svgr(svgFile);
// Render paint object
svgr.render(&painter);
// end paint
painter.end();
}
您的问题很可能是 displaychart.h
文件的 include guard。
尝试更改以下...
#ifndef DISPLAYWIDGET_H
#define DISPLAYWIDGET_H
...进入
#ifndef DISPLAYCHART_H
#define DISPLAYCHART_H
通过在两个文件中使用相同的包含防护,您可以有效地防止编译器看到第二个 class,从而导致您看到的错误。