Qt Painter外部paintEvent – 不可能 – 解决方法?

所以看起来,Qt4不会让你在绘画事件之外的窗口上画画。 我有很多代码,希望能够绘制橡皮筋线(通用绘图代码为特定的专有接口,然后在给定的UI中实现)。 我已经阅读了pixmap方法,这将是很多工作,我不认为这是我想要的。

有没有一个解决方法,让我做我想要的呢? 我只需要在屏幕上绘制XOR带。

尝试了WA_PaintOutsidePaintEvent标志。 然后我看到那个说不能在Windows上工作的位。

Solutions Collecting From Web of "Qt Painter外部paintEvent – 不可能 – 解决方法?"

在现代化的合成桌面中,窗口绘画需要由窗口管理器进行同步,以便可以将Alpha混合和其他效果依次应用到正确的后台缓冲区,然后将其结果翻转到屏幕上,以便无撕裂窗口动画。

在这个过程的带外调用绘制操作(在底层平台上受到遗留原因的支持)将会颠覆这个过程,并导致执行一些非最优代码路径。

基本上,当你在一个窗口上进行绘画的时候:调用无效函数来安排绘画,并在绘画事件中绘画。

只需绘制到QPixmap ,并将其复制到paintEvent的真实小部件。 这是唯一的标准方式。 你不应该试图解决它。

似乎如果你能访问有问题的窗口的Hwnd,你可以在那个表面上画。 否则,我不确定。 如果通过像素图方法,你的意思是这样的,我不认为这是一个不好的解决方案:

 m_composed_image = QImage(size, QImage::Format_ARGB32); m_composed_image.setDotsPerMeterX(dpm); m_composed_image.setDotsPerMeterY(dpm); m_composed_image.fill(Qt::transparent); //paint all image data onto new image QPainter painter(&m_composed_image); painter.drawImage(QPoint(0, 0), m_alignment_image); 

正如其中一个答案中提到的那样,最好的方法是制作一个像素图缓冲区。 绘画作品将在缓冲区中完成,完成后, repaint()将被调度。 paintEvent()函数通过复制像素缓冲区来绘制小部件

我试图在用户输入值并按下一个按钮之后在小部件区域绘制一个圆。 这是我的解决方案。 将drawCircle()插槽连接到clicked()信号。

 class PaintHelper : public QWidget { Q_OBJECT private: QPixmap *buffer; public: explicit PaintHelper(QWidget *parent = 0) : QWidget(parent) { buffer=new QPixmap(350,250);// this is the fixe width of this widget so buffer->fill(Qt::cyan); } signals: public slots: void drawCircle(int cx, int cy, int r){ QPainter painter(buffer); painter.setBrush(QBrush(QColor(0,0,255))); // A part of mid-point algorithm to draw 1/8 pacrt of circle int x1=0,y1=r; int p=1-r; for(int i=0;y1>=x1;i++){ painter.drawPoint(x1+cx,y1+cy); x1++; if(p>0){ p+=3+x1; } else{ y1--; p+=2*x1-2*y1; p++; } } this->repaint(); } // QWidget interface protected: void paintEvent(QPaintEvent *event) { QPainter painter(this); painter.drawPixmap(0,0,*buffer); } };