对于qt开发人员来说,这是一个非常简单的问题。
我有一个非常大的代码(我没写),它使用qt进行绘图,我刚刚创建了一个on_actionSomething_toggled(bool checked)
我想要它绘制几何几何东西。
如果你能告诉我如何画一条线(在那个方法里面),我会很高兴,我可以随后用这些线画出我想要的东西。
我已经尝试过:
void
MainWindow::on_actionSomething_toggled(bool checked){
QPainter pa(this);
pa.drawLine(20, 40, 250, 40);
}
但它说:
QPainter::begin: Widget painting can only begin as a result of a paintEvent
所以我只想知道如何在我的on_actionSomething_toggled
方法中绘制一条简单的线,或者我做错了什么,我怎么能简单地在我的大代码中添加这个绘图线功能。
答案 0 :(得分:2)
与警告信息一样,通常使用QPainter绘制内容的唯一合适时间来自paintEvent()方法。
所以做你想做的事的通常方法是:
1)当你想绘制一条线时,设置一个成员变量以记住你想要这样做(例如this-> draw_the_line = true;)
2)在将draw_the_line设置为新值后,在要创建一行的小部件上调用update()...这将告诉Qt尽快调度对该小部件的paintEvent()的调用
3)重新实现widget的paintEvent()方法,如下所示:
void MyWidgetSubclass :: paintEvent(QPaintEvent * e)
{
TheWidgetSuperclass::paintEvent(e); // this will draw the widget's usual graphics
// Plus your custom stuff on top, if appropriate
if (this->draw_the_line)
{
QPainter p(this);
p.drawLine(20,40,250,40);
}
}
请注意,为了做到这一点,你必须子类化小部件(这样你就可以在子类中实现自己的paintEvent()版本,而不是通常的paintEvent()方法) - 如果你还没有这样做过。
答案 1 :(得分:0)
正如警告信息所示,绘制小部件只能在绘画事件中发生。
实现目标的一种方法是首先绘制到QPixmap,向窗口小部件发送更新通知,然后让绘图事件处理程序绘制该像素图。
另一种 - 也许更简单,更优雅 - 的方法是在QPainterPath中准备绘制操作。然后,您可以在窗口小部件的绘图事件处理程序中绘制它。
两种方式都假设您已通过覆盖QWidget::paintEvent(QPaintEvent*)实现了自己的绘制事件处理程序。
答案 2 :(得分:0)
您应该使用Graphics View Framework。它在内部管理绘画。您需要在插槽中做的唯一事情是:
scene->addLine(20, 40, 250, 40);