gpt4 book ai didi

c++ - 使用 QGraphicsView 子类用 QPainter 画一条线

转载 作者:行者123 更新时间:2023-11-30 02:31:07 57 4
gpt4 key购买 nike

问题:我无法调用 GraphicsView 的 paintEvent,或者换句话说,我不知道如何让 QPainter 一起工作。

  • 我正在使用 qtcreator 的设计器将 QGraphicsView 放入主窗口。
  • 我对 QGraphicsView(class Draw)进行了子类化,覆盖了 paintEvent 并在主类中保存了这个子类(Draw draw)的一个实例窗口(我想把复杂的图移到别处)
  • 我创建了一个新的 QGraphicsScene 并将其分配给 QGraphicsView 的(ui->graphicsViewdraw)所以当我在 Draw 中绘制时,它也会在
    ui->graphicsview 中明显生效(我希望如此)。
  • 我确定当我使用新的 scene 对象进行绘制时,我会得到一个可见的结果(但是,我不想使用 scene 对象进行绘制但是 QPainter。原因是为了另一个问题,所以我希望它不是必需的)因此我试图子类化 QGraphicsView 并覆盖 paintEvent 所以我得到 QPainter p(this) 很容易。
  • 当事件发生时,我在 Window.cpp 中调用 MyRepaint(),我试图在我的 上调用 paintEvent() code>Draw 对象 - 但它不工作。

主窗口“Window.cpp”:

Window::Window(QWidget* parent) :
QMainWindow(parent),
ui(new Ui::Window),
draw(*this) //my own QGraphicsView instance (see class below)
{
ui->setupUi(this);
//assigning a new scene to draw and to window's graphicsView
this->scene = new QGraphicsScene(this);
this->draw.setScene(scene);
this->ui->graphicsView->setScene(scene);
}

void Window::MyRepaint()
{
qInfo() << "Repaint - start" << this->draw.scene();
this->draw.scene()->update(this->draw.sceneRect());
this->draw.repaint();
this->draw.viewport()->update();
/*only the following line made the paintEvent executed eventually but without a visible result and with an error in the output*/
this->draw.paintEvent(NULL);
qInfo() << "Repaint - end";
}

子类化 QGraphicsView,文件:Draw.h:

class Window;
class Draw : public QGraphicsView{
private:
Window& parent;

public:
Draw(Window &parent);
void paintEvent(QPaintEvent*e) override;
};

绘图.cpp

void Draw::paintEvent(QPaintEvent *e)
{
qInfo() << "trying to draw";
QPainter p(this);
p.setPen(QPen(Qt::black, 12, Qt::DashDotLine, Qt::RoundCap));
p.drawLine(0, 0, 200, 200);
}

输出:

Repaint - start QGraphicsScene(0x15c7eca8)
trying to draw
QWidget::paintEngine: Should no longer be called
QPainter::begin: Paint device returned engine == 0, type: 1
QPainter::setPen: Painter not active
QPainter::viewport: Painter not active
QPainter::end: Painter not active, aborted
Repaint - end

也许我选择了一个完全错误的方法。

最佳答案

QGraphicsView 旨在与 QGraphicsScene 一起使用。如果你只想画线,那么从 QWidget 派生并覆盖它的 paintEvent。在设计器中将 QWidget 提升到您的派生类。

另外,Qt 有很好的文档。我建议你访问this页面。

关于c++ - 使用 QGraphicsView 子类用 QPainter 画一条线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37981512/

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