QPainter的。画线

时间:2014-07-10 08:48:50

标签: qt qpainter

我想画线。

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    QPainter painter(&w);
    painter.setPen(QPen(Qt::black, 12, Qt::DashDotLine, Qt::RoundCap));
    painter.drawLine(0, 0, 200, 200);

    return a.exec();
}

但窗户上没有任何画作。有什么问题?

3 个答案:

答案 0 :(得分:14)

至少在Windows和Mac OS上,您无法在paintEvent()功能之外进行绘制。不过,您可以覆盖MainWindow班级' paintEvent()函数在那里画线。例如:

class Widget : public QWidget
{
protected:
    void paintEvent(QPaintEvent *event)
    {
        QPainter painter(this);
        painter.setPen(QPen(Qt::black, 12, Qt::DashDotLine, Qt::RoundCap));
        painter.drawLine(0, 0, 200, 200);
    }
};

用法:

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    Widget w;
    w.show();
    [..]

答案 1 :(得分:10)

您无法在绘画事件之外的小部件上绘画。但您可以随时在非小部件上绘画,例如QImageQPixmapQPicture

screenshot

#include <QtWidgets>

int main(int argc, char *argv[])
{
   QApplication a(argc, argv);

   QPicture pi;
   QPainter p(&pi);   
   p.setRenderHint(QPainter::Antialiasing);
   p.setPen(QPen(Qt::black, 12, Qt::DashDotLine, Qt::RoundCap));
   p.drawLine(0, 0, 200, 200);
   p.end(); // Don't forget this line!

   QLabel l;
   l.setPicture(pi);
   l.show();
   return a.exec();
}

答案 2 :(得分:1)

小部件只能在各自的绘画事件中绘制。您可以在任何函数中绘制像素图,但是您需要在小部件绘制事件中显示结果。

来自doc:

  

警告:当paintdevice是一个小部件时,只能使用QPainter   在paintEvent()函数内或在调用的函数中   的paintEvent();这是除非Qt :: WA_PaintOutsidePaintEvent小部件   属性已设置。