gpt4 book ai didi

qt - 如何在 QMainWindow 中绘画?

转载 作者:行者123 更新时间:2023-12-05 04:17:33 30 4
gpt4 key购买 nike

我有一个非常奇怪的 QPainter 行为。在我的“MainWindow::paintEvent()”中它工作正常:

QPainter painter(this);
qDebug() << "painter adress in paintEvent: " << (&painter);
painter.setBrush(Qt::red);
painter.drawRect(100, 100, 100, 100);

到目前为止,还不错。但我实际上想使用我编写的类的函数进行绘画,所以我的“paintEvent()”看起来像这样:

QPainter painter(this);
qDebug() << "painter adress in paintEvent: " << (&painter);
painter.setBrush(Qt::red);
painter.drawRect(100, 100, 100, 100);
instance_of_my_class->paint(&painter);
painter.drawRect(150, 150, 100, 100);

上面调用的'paint(QPainter *painter)'看起来像这样:

qDebug() << "painter adress in paint: " << painter;
painter->setBrush(QColor(0, 0, 80));
painter->drawRect(0, 0, 1000, 1000);

显然,我现在希望看到深蓝色背景和一个红色矩形(第二个,第一个应该在“paint”中被覆盖)。但是,我看到两个红色矩形,并且在我的工具栏中所有图标都有深蓝色背景。此外,“qDebug()”的输出如下所示:

painter adress in paintEvent:  0xbfd43b54
painter adress in paint: 0xbfd43b54

它绝对是同一个 QPainter,但在我的类(class)中,它在我工具栏中的图标下方绘画!?!

最佳答案

QMainWindow 绘制事件中绘制任何内容通常是错误的。一个主窗口可以有各种子部件。您的画家会很乐意干涉这些——您不会显示任何枚举停靠窗口和子窗口等的代码。

要在主窗口中绘制某些内容,您需要在单独的小部件中绘制它,并且必须通过 setCentralWidget 将该小部件提供给主窗口。

如果您不需要它的全部功能,您绝对不需要使用 QMainWindow。这意味着:如果您不关心菜单栏和停靠栏小部件,请不要使用 QMainWindow

这个有效:

screenshot

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

class Bottom {
public:
void paint(QPainter * p) {
p->setBrush(Qt::blue);
p->drawRect(0, 0, 1000, 1000);
}
};

class Top : public QWidget {
Bottom * m_bottom;
void paintEvent(QPaintEvent *) {
QPainter p(this);
p.setPen(Qt::NoPen);
p.setBrush(Qt::red);
p.drawRect(0, 0, 100, 100);
m_bottom->paint(&p);
p.setBrush(Qt::green);
p.drawRect(50, 50, 100, 100);
}
public:
Top(Bottom * bottom, QWidget * parent = 0) :
QWidget(parent), m_bottom(bottom) {}
};

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QMainWindow w;
Bottom b;
Top t(&b);
w.setCentralWidget(&t);
w.setMinimumSize(200, 200);
w.show();
return a.exec();
}

关于qt - 如何在 QMainWindow 中绘画?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22406892/

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