gpt4 book ai didi

c++ - 在 Qt 中,我试图在 QLabel 上绘画,但 QPaintEngine 说要关闭。详情如下 :

转载 作者:行者123 更新时间:2023-11-28 05:57:53 24 4
gpt4 key购买 nike

我目前可以看到对话窗口,唯一看不到的是显示图片的标签和绘制的矩形。现在我相信是因为小部件覆盖了标签,但我想不出绕过它的方法。应用程序输出说:QRect(10,10 0x0)0 0 0 final 0QWidget::paintEngine:不应再调用QPainter::begin:绘画设备返回引擎 == 0,类型:1QWidget::paintEngine:不应再调用QPainter::begin:绘画设备返回引擎== 0类型:1,QPainter::setPen:Painter 未激活QPainter::drawRects:Painter 未激活,qDebug PAINTEVENT

我的代码如下:

这是 my_qlabel.cpp

/使用鼠标事件/

    #include "my_qlabel.h"
#include <QMouseEvent>
#include <QPaintEvent>

my_qlabel::my_qlabel(QWidget *parent) :
QLabel (parent)
{
x = NULL;
y = NULL;

}//constructor

void my_qlabel::mouseMoveEvent (QMouseEvent *e)
{
this->x = e->x();
this->y = e->y();

emit mouse_pos();
}//mouseMoveEvent

void my_qlabel::mouseReleaseEvent (QMouseEvent *e)
{
this-> x = e->x ();
this-> y = e->y ();
emit mouse_release();
}//mouseReleaseEvent

void my_qlabel::mousePressEvent(QMouseEvent *)
{

emit mouse_pressed ();

}//mousePressEvent


void my_qlabel::paintEvent(QPaintEvent *pa)
{
this->parentWidget ();
this->lower ();

emit mouse_rectangle ();
pa->accept (); //accepts rect in pic
}//paintevent

void my_qlabel::leaveEvent(QEvent *)
{

emit mouse_left();
}//leaveEvent

下面是我的dialog.cpp:

/*在 my_qlabel 和对话框之间建立连接。 */

    #include "dialog.h"
#include "ui_dialog.h"
#include "my_qlabel.h"
#include <QPainter>
#include <QEvent>

Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
InitialX = 0;
InitialY = 0;
Height = 0;
Width = 0;

ui->setupUi(this);

connect(ui-> lblMouse, SIGNAL(mouse_pos()), this, SLOT(mouse_current_pos()));
connect(ui-> lblMouse, SIGNAL(mouse_pressed()), this, SLOT(mouse_pressed()));
// connect(ui-> lblMouse, SIGNAL(mouse_pressed()), this, SLOT(paintEvent(QPaintEvent*)));
connect(ui-> lblMouse, SIGNAL(mouse_release()), this, SLOT(mouse_release()));
connect(ui-> lblMouse, SIGNAL(mouse_left()), this, SLOT(mouse_left()));
connect (ui->lblMouse,SIGNAL(mouse_rectangle()), this,SLOT(mouse_rectangle()));

//MUST: create function for clear rectangle
//connect(ui-> ClearSelection, SIGNAL(rectangle_clear()), this, SLOT(mouse_left()));
/*delete rectangle points and update paint*/
}

Dialog::~Dialog() { delete ui;} //deconstruct

/* Generate mouse position on real time in the label of X and Y*/
void Dialog::mouse_current_pos ()
{
ui->lblMouse_Current_Pos->setText(QString
(" X = %1 , Y = %2")
.arg(ui->lblMouse->x)/*%1*/
.arg(ui->lblMouse->y));/*%2*/
qDebug()<<"qDebug MOUSE_CURRENT_POS \n";
}//mouse_current_pos()

/* Uses mouse event to START rectangle paint event*/
void Dialog::mouse_pressed()
{
ui->lblMouse_Current_Event->setText(QString
("Mouse pressed at location %1 and %2!!!")
.arg(ui->lblMouse->x) //%1
.arg(ui->lblMouse->y)); //%2

/*Sets location of X and Y when is pressed*/
InitialX = ui->lblMouse->x;
InitialY = ui->lblMouse->y;
qDebug()<<"UPDATE OF MOUSE_PRESSED \n";
update();

} //mouse_pressed()

/*Uses release mouse event to END rectangle paint event*/
void Dialog::mouse_release()
{
ui->lblMouse_Current_Event->setText(QString
("Mouse released at location %1 and %2!!!")
.arg(ui->lblMouse->x) /*%1*/
.arg(ui->lblMouse->y));/*%2*/

/*Sets location of width and height when is released*/
Width= ui->lblMouse->x - InitialX;
Height= ui->lblMouse->y - InitialY;
qDebug()<<Width<<" final "<<Height;

qDebug()<<"qDebug MOUSE_RELEASE \n";
update();
}//mouse_release()

/*Mouse finds the cursor out of mouse area*/
void Dialog::mouse_left()
{
ui->lblMouse_Current_Event->setText("Mouse Left :( !!");

qDebug()<<"qDebug MOUSE_LEFT \n";
}//mouse_left()

void Dialog::mouse_rectangle()
/*PaintEvent paint rectangle*/
//!!!!!Runs good: Paints a rectangle and is adjusted!!!!
//void Dialog::paintEvent(QPaintEvent *pa)
{
// this->raise ();
QRect rectangle
(InitialX,InitialY, //Initial point of rectangle at press event
Width, Height); //Final point of rectangle at release event

rectangle.adjust (10,10,10,10);

qDebug()<<rectangle;
qDebug()<<InitialX<<InitialY<<Width<<" final "<<Height;

QPainter painter(this);
painter.begin (this);
painter.setPen(QPen(Qt::red, //Propierties of rectangle
2.0,
Qt::DotLine,
Qt::SquareCap,
Qt::MiterJoin));
painter.drawRect(rectangle);

qDebug()<<"qDebug PAINTEVENT \n";
}//paintEvent

希望我已经说清楚了,我想在 qlabel 上绘图,但我不能。如果您能告诉我如何以明确的方式修复代码,那就太好了。

最佳答案

我看到的问题是,您通过 my_qlabels paintEvent 中的发射调用不同类的绘图函数以在该不同类中绘制。

如果一个小部件接收到paintEvent,那么只有那个小部件可以被绘制。仅在该类中有效 QPainter p(this)

在您的情况下,my_qlabel 具有 paintEvent,但您“调用”Dialog 类的 mouse_rectangle 以在 Dialog 上绘制。但是 Dialog 还没有准备好绘画。因此 Paint device returned engine == 0 问题。

如果您的标签显示图片,您的标签需要自己绘制以标记图片上的区域。并且标签将放置在对话框中。在那个paintEvent中,一开始,你应该调用QLabel::paintEvent(event)让标签做图片绘制。您的绘图将位于该图片之上。

在标签本身的标签的 paintEvent 中绘制很重要。

您仍然可以使用另一个函数,但您必须传递 my_qlabel 的指针并使用该指针创建 QPainter(例如 QPainter p(label) 而不是 QPainter p(this))。

所以你可以在 my_qlabel 上传递 this 和 emit,比如 emit mounse_rectangle(this) 如果你改变信号并插入 accept QWidget * 作为参数。不过,我更喜欢直接从 paintEvent 调用任何函数,而不是使用信号和插槽机制,这可能会在性能方面引入相当大的开销并降低代码清晰度。

关于c++ - 在 Qt 中,我试图在 QLabel 上绘画,但 QPaintEngine 说要关闭。详情如下 :,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33810376/

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