- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前可以看到对话窗口,唯一看不到的是显示图片的标签和绘制的矩形。现在我相信是因为小部件覆盖了标签,但我想不出绕过它的方法。应用程序输出说:QRect(10,10 0x0)
,0 0 0 final 0
,QWidget::paintEngine:不应再调用
,QPainter::begin:绘画设备返回引擎 == 0,类型:1
,QWidget::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/
我正在编写一个 JS 程序,我有一个条件可以根据输入进行一些算术运算。如果我遇到操作类型为“add”,我需要将两个值相加;如果我得到“times”作为我的运算符值,我需要相乘。 我尝试使用基本的 if
我正在编写一个仅作为查看器的应用程序 - 无需创建、无需编辑、无需保存。 显然,那么,不会有自动保存,但是还有什么其他东西可以从 autosavesInPlace 返回 YES 改变世界,从而对观看者
Azure 开始出现以下错误: Unsupported token. Unable to initialize the authorization context. 每当我尝试更改我的应用程序时,我都
当我编写 out.println() 时,Eclipse 提示 out 无法解析。 我导入了 java.io.* 和其他 servlet 包。 最佳答案 只是在黑暗中拍摄,我认为这就是您正在寻找的出路
Azure 开始出现以下错误: Unsupported token. Unable to initialize the authorization context. 每当我尝试更改我的应用程序时,我都
是否可以执行类似的操作来检查 radio 表单是否未选中: if !($(this).find("input:checked")) {} 正确的语法是什么? 最佳答案 试试这个: $(this).fi
我正在尝试从表中选择行,其中 date 列值等于澳大利亚悉尼的当前日期 (UTC+10h)。服务器位于悉尼,因此我想使用 SYSDATETIME()。这是我的查询: SELECT * FROM dat
我听说 JavaScript 实际上并不像其他语言那样“指向”内存中的值(或对象,因为在 JS 中一切都是对象)。相反,JS 变量引用内存中的其他值/对象。这是真的?指向和引用之间的语义区别是什么?
我的计算机科学类(class)有一项作业,其中要求读取包含多个测试分数的文件,并要求我对它们进行求和并求平均值。虽然求和和求平均值很容易,但我在读取文件时遇到问题。老师说用这个语法 Scanner s
Java 的 XML 解析器似乎认为我的 XML 文档在根元素之后的格式不正确。但我已经用几种工具验证了它,但他们都不同意。这可能是我的代码错误,而不是文档本身的错误。如果你们能给我提供任何帮助,我将
根据这份文件: http://www.stroustrup.com/terminology.pdf l 值具有同一性且不可移动。 公关值是可移动的,但没有身份。 x 值具有同一性并且是可移动的。 关于
这个问题在这里已经有了答案: What does "atomic" mean in programming? (7 个答案) 关闭 5 年前。 我正在阅读 MongoDB 的 documentati
在 PHP 和 MySQL 中有没有一种方法能够比较 2 个不同的数组(列表)变量并说出有多少项是相同的 例如, $array1 = "hello, bye, google, laptop, yes"
本文来自 Effective Java Programs that use the int enum pattern are brittle. Because int enums are compil
C++ 中有一些特性是类型安全的,而另一些则不是。 C++ 类型安全示例: char c = 'a'; int *p = &c; // this is not allowed (compiler
我有一个 CS 课的作业,它说要读取一个包含多个测试分数的文件,并要求我对它们求和并取平均值。虽然求和和平均很容易,但我在读取文件时遇到了问题。老师说要用这个语法 Scanner scores = n
嗯.. 有时,PyDev 会说“ Unresolved 导入错误”。 在我的环境中 Python2.6.6 Eclipse3.7 PyDev2.2.2 错误是。 > Unresolved import
我正在向服务器发送请求,服务器正在处理请求并做出响应。但是在我的应用程序中,我收到了: Error Domain=NSURLErrorDomain Code=-1017 "cannot parse r
在我最近的一次讨论中,有人告诉我这样说是不正确的,因为 Ajax 已经是 Javascript。 上下文: “我如何在网页中 blablababal,这样它就不必刷新页面” 我的回答: “使用 Jav
下午好。 我一直在尝试使用 ffmpeg 将 .mpeg 拆分为一系列 .jpeg 图像。请注意,这是指定 here 的逆问题,但我面临的问题与该线程的作者面临的问题不同。 具体来说,我已经在我的 f
我是一名优秀的程序员,十分优秀!