Qt - 非常简单的切换动作

时间:2013-07-09 03:31:52

标签: c++ qt qt4

对于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方法中绘制一条简单的线,或者我做错了什么,我怎么能简单地在我的大代码中添加这个绘图线功能。

3 个答案:

答案 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);