我想画线。
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();
}
但窗户上没有任何画作。有什么问题?
答案 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)
您无法在绘画事件之外的小部件上绘画。但您可以随时在非小部件上绘画,例如QImage
,QPixmap
或QPicture
:
#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小部件 属性已设置。