Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在Qt中绘制主类的子类_C++_Qt_Qt5_Qframe - Fatal编程技术网

C++ 在Qt中绘制主类的子类

C++ 在Qt中绘制主类的子类,c++,qt,qt5,qframe,C++,Qt,Qt5,Qframe,我创建了一个名为widget.cpp的主类,它继承QFrame。我从widget.cpp创建了一个名为frame.cpp的子类,在其中我重新实现了绘制图像的paintEvent方法。问题是,当我试图通过widget.cpp创建一个paintEvent方法直接绘制图像时,效果很好。但是在另一种情况下,当我在子类frame.cpp中实现它时,它并没有正常工作。是不是我做错了什么 widget.h #ifndef WIDGET_H #define WIDGET_H #include <QFra

我创建了一个名为widget.cpp的主类,它继承QFrame。我从widget.cpp创建了一个名为frame.cpp的子类,在其中我重新实现了绘制图像的paintEvent方法。问题是,当我试图通过widget.cpp创建一个paintEvent方法直接绘制图像时,效果很好。但是在另一种情况下,当我在子类frame.cpp中实现它时,它并没有正常工作。是不是我做错了什么

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QFrame>
#include <QPainter>
#include "frame.h"

class frame;
namespace Ui {
    class Widget;
}
class Widget : public QFrame
{
    Q_OBJECT
public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
private:
    Ui::Widget *ui;
    frame * f;
};
#endif // WIDGET_H
框架.h

#ifndef FRAME_H
#define FRAME_H

#include <QObject>
#include <QWidget>
#include <QPainter>

class frame : public QWidget
{
    Q_OBJECT
public:
    explicit frame(QWidget *parent = 0);

protected:
    void paintEvent(QPaintEvent *p);

signals:

public slots:
};

#endif // FRAME_H
如果在上述代码中使用QRect target0,0,20,10,则会绘制图像

testImage.pro

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = testImage
TEMPLATE = app

DEFINES += QT_DEPRECATED_WARNINGS

SOURCES += main.cpp\
        widget.cpp \
    frame.cpp

HEADERS  += widget.h \
    frame.h

FORMS    += widget.ui

RESOURCES += \
    src.qrc

DISTFILES +=
widget.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Widget</class>
 <widget class="QWidget" name="Widget">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>823</width>
    <height>468</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Widget</string>
  </property>
  <widget class="QFrame" name="frame">
   <property name="geometry">
    <rect>
     <x>200</x>
     <y>60</y>
     <width>420</width>
     <height>300</height>
    </rect>
   </property>
   <property name="minimumSize">
    <size>
     <width>420</width>
     <height>300</height>
    </size>
   </property>
   <property name="maximumSize">
    <size>
     <width>420</width>
     <height>306</height>
    </size>
   </property>
   <property name="frameShape">
    <enum>QFrame::StyledPanel</enum>
   </property>
   <property name="frameShadow">
    <enum>QFrame::Raised</enum>
   </property>
  </widget>
 </widget>
 <layoutdefault spacing="6" margin="11"/>
 <resources/>
 <connections/>
</ui>

如果您想替换一个X类小部件,您必须创建一个从该类继承的类,在您的情况下,框架必须从QFrame继承,而不是直接从QWidget继承,因为Qt设计器将使用QFrame没有的QFrame方法,而不是从QFrame继承的类(如果它有)

因此,您应该更改代码中的下一部分

框架.h

#ifndef FRAME_H
#define FRAME_H

#include <QObject>
#include <QWidget>
#include <QPainter>

class frame : public QWidget
{
    Q_OBJECT
public:
    explicit frame(QWidget *parent = 0);

protected:
    void paintEvent(QPaintEvent *p);

signals:

public slots:
};

#endif // FRAME_H
frame.cpp

#include "frame.h"

frame::frame(QWidget *parent) : QWidget(parent)
{

}

void frame::paintEvent(QPaintEvent *p)
{
    QPainter* pPainter = new QPainter(this);
    QImage img(":/left.png");
    Q_ASSERT(!img.isNull());
    QRect source(0,0,20,10);
    QRect target(50,50,20,10);
    pPainter->drawImage(target, img,source);
    QWidget::paintEvent(p);
    QWidget::update();
}
代码中观察到的另一个错误是在paintEvent内部调用update,这可能会生成一个无限循环,因为update间接调用paintEvent。还有一个小部件是你的一个绘画空间,这个空间我们可以通过rect方法得到,如果你在这个空间之外画什么都没有画。另一个糟糕的做法是创建一个指向QPainter的指针,因为它将不断被调用到该方法,并且除了正确地消除它之外,您还将创建内存。根据上述情况,我提出以下准则:

void frame::paintEvent(QPaintEvent *p)
{
    QWidget::paintEvent(p);
    QPainter pPainter(this);
    QImage img(":/left.png");
    Q_ASSERT(!img.isNull());
    QRect source(0,0,20,10);
    QRect target(50,50,20,10);
    pPainter.drawImage(target, img, source);
}
最重要的是,当您运行f=newframeui->frame;您正在创建一个新的小部件,默认情况下该小部件相对于父部件占据一个位置,这就是您看到图像的原因,但这并不合适,您应该做的是升级该小部件

要升级,请右键单击QtDesigner中的QFrame,并将显示一个菜单,选择升级的小部件,打开一个对话框窗口,在其中,您必须在升级的类名中输入您创建的类的名称,在案例框架中,在头文件中输入您的类的.h文件,在案例框架.h中,然后按添加按钮,然后按升级按钮。如下图所示:

编译项目后,作为最终建议,将frame的Qt Designer中的小部件名称更改为另一个名称,例如myFrame,这样就不会与类的名称混淆


完整的示例可以在下面的

中找到,从第一印象来看,您似乎忘记了将paintEvent声明为virtual和/或使用override关键字。@PhilippLudwig不必使用override@Som您可以包含.ui文件,以便能够复制代码,这意味着:无法正常工作?这有点混乱,因为当我在QRect target50,50,20,10中保留行的值时;从0到80,图像显示正确。在这之后,它会缩小然后消失,图像分辨率只有20*10,小部件大约是500*400@PhilippLudwig virtual没有做出任何改变。@eyllanesc你是对的,我的错。
frame::frame(QWidget *parent) : QFrame(parent)
{

}
void frame::paintEvent(QPaintEvent *p)
{
    QWidget::paintEvent(p);
    QPainter pPainter(this);
    QImage img(":/left.png");
    Q_ASSERT(!img.isNull());
    QRect source(0,0,20,10);
    QRect target(50,50,20,10);
    pPainter.drawImage(target, img, source);
}