如何在 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,从而导致您看到的错误。