gpt4 book ai didi

c++ - Qt5 paintEvent() 区域太小

转载 作者:行者123 更新时间:2023-11-30 03:18:26 26 4
gpt4 key购买 nike

我想实现一个自定义小部件。通过双击将 Node 对象添加到拥有的 Graph 小部件时,Node::paintEvent 正确发生,但是 的区域code>QPaintEvent 是常量并且太小,无论我在哪里添加它。指示的边界重绘框始终位于 (0,0),宽度/高度为 (100,30)。

知道为什么会这样吗?

代码

#include <QApplication>
#include <QMainWindow>
#include <QPainter>
#include <QMouseEvent>

#include <iostream>
#include <vector>

#define DEBUG(lvl, x) \
std::clog << "L" << __LINE__ << ": " << x << "\n";

class Node final : public QWidget
{
protected:
void paintEvent (QPaintEvent * event) override {
DEBUG(0, "Node::paintEvent");
QPainter painter(this);
painter.setBrush(QColor(127,127,127));
painter.drawRect(posX, posY, width, height);
auto x = event->rect();
DEBUG(0, "PaintBox:" << x.x() << "::" << x.y() << "::" << x.width() << "::" << x.height());
}
public:
explicit Node (QWidget * parent = 0): QWidget(parent) {}
int posX{0}, posY{0}, width{60}, height{60};
};

class GraphView final : public QWidget
{
public:
explicit GraphView (QWidget * parent = 0): QWidget(parent) {}
protected:
void paintEvent (QPaintEvent *) override {
DEBUG(0, "GraphView::paintEvent");
}

void mouseDoubleClickEvent (QMouseEvent * event) override {
DEBUG(0, "mouseDoubleClickEvent");
auto ptr = new Node(this);
ptr->posX = event->x();
ptr->posY = event->y();
nodes.push_back(ptr);
ptr->show();
}

void mousePressEvent (QMouseEvent * event) override {
DEBUG(0, "mousePressEvent");
auto ptr = static_cast<Node*>(childAt(event->pos()));
if (ptr) {
DEBUG(0, "FOUND X");
}
}
std::vector<Node*> nodes;
};


int main (int argc, char *argv[])
{
QApplication a(argc, argv);

auto* gv = new GraphView{};
QMainWindow w;
w.setCentralWidget(gv);
w.resize(640, 480);
w.show();

return a.exec();
}

双击窗口区域的任何地方返回:

L34: GraphView::paintEvent
L48: mousePressEvent
L38: mouseDoubleClickEvent
L34: GraphView::paintEvent
L16: Node::paintEvent
L21: PaintBox:0::0::100::30

如果双击 0,0 和 100,30 之间的区域,节点将按应有的方式显示。

最佳答案

请注意,Qt 已经内置了一个非常好的图形场景小部件。看看 Graphics View Framework .它针对数千个项目进行了优化,支持单个场景的多个 View 、缩放、剪切、旋转等。


但是如果你想自己处理:

绘画事件中的坐标总是相对于小部件的根。所以 (0,0) 是小部件的左上角,不管它放在哪里(参见 coordinate systems )。

当您将子小部件(作为您的节点)直接添加到小部件(而不是使用布局)时,它被放置在左上角。它的大小由 sizeHint 决定。

所以现在,当您点击例如在 (200,200) 您将添加一个新的小部件,并相应地设置其位置成员。这导致在 (0,0)GraphView 小部件中有一个 Node 小部件,大小为 (100,30)。然后在绘制事件中,您在 (200,200) 处绘制了一个矩形,它在小部件边界之外!

您应该设置几何图形,以便将子部件放置在 Qt 的坐标系中:

 void GraphView::mouseDoubleClickEvent (QMouseEvent * event) {
auto ptr = new Node(this);
ptr->setGeometry(event->x(), event->y(), ptr->width, ptr->height);
nodes.push_back(ptr);
ptr->show();
}

然后根据 (0,0) 绘制:

void Node::paintEvent (QPaintEvent * event) {
QPainter painter(this);
painter.setBrush(QColor(127,127,127));
painter.drawRect(0, 0, width, height);
}

关于c++ - Qt5 paintEvent() 区域太小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54752184/

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