除了@Mat告诉你:“事件”是推出一个画家的正确方法。
QPainter只能在QPaintEvent事件后携带可以绘制对象的安全区域后触发。
所以,你必须找到另一种策略来运输你的数据,以帮助 我会提出一种简单的方法,它可以调整到很多情况。
widget.cpp
#include <QtGui>
#include "widget.h"
#define MIN_DCX (0.1)
#define MAX_DCX (5.0)
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
dcx=MIN_DCX;
setFixedSize(170, 100);
}
void Widget::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
QPainter painter;
painter.begin(this);
painter.setRenderHint(QPainter::Antialiasing);
painter.setPen(Qt::black);
pcx=dcx*2;
QRect rect = QRect(50-dcx,25-dcx,60+pcx,40+pcx);
painter.drawText(rect, Qt::AlignCenter,printData);
painter.drawRect(rect);
painter.end();
}
void Widget::setPrintData(QString value){
printData = value;
dcx=(dcx>MAX_DCX)?MIN_DCX:dcx+MIN_DCX;
}
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent);
void setPrintData(QString value);
protected:
void paintEvent(QPaintEvent *event);
private:
QString printData;
float dcx;
float pcx;
};
#endif
window.cpp
#include <QtGui>
#include "widget.h"
#include "window.h"
#define MAX_SDCX 20
Window::Window()
: QWidget()
{
gobject = new Widget(this);
textMode=1;
rectMode=1;
gobject->setPrintData(msgs[textMode]);
QGridLayout *layout = new QGridLayout;
layout->addWidget(gobject, 0, 0);
setLayout(layout);
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(dataOnAir()));
timer->start(10);
setWindowTitle(tr("Rect Shaking"));
}
void Window::dataOnAir(){
if((++rectMode)>MAX_SDCX){
rectMode=0;
textMode^=1;
}
gobject->setPrintData(msgs[textMode]);
gobject->repaint();
}
window.h中
#ifndef WINDOW_H
#define WINDOW_H
#include <QWidget>
#include "widget.h"
class Window : public QWidget
{
Q_OBJECT
public:
Window();
private slots:
void dataOnAir();
private:
Widget *gobject;
const QString msgs[2] = {"Hello","World"};
int textMode;
int rectMode;
};
#endif
的main.cpp
#include <QApplication>
#include "window.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
Window window;
window.show();
return app.exec();
}
正如可以在代码被执行的定时器,物体外看到“ Widget“
每10ms发送一个重画小部件以重绘一个具有不同大小的“矩形”,并且每20个周期(200ms)将文本“hello”更改为“世界”
在本例中,您可以看到以任何方式需要覆盖QPainterDevice架构。
您也可能会注意到“的paintEvent”内“事件”被压制,不能直接使用,但它是必不可少的执行顺序的QPainter。
为什么你期望一个随机命名的函数被调用来做任何事情?你的第一种方法很好。不命名参数你不需要(但)是既合法又惯用的C++。 – Mat
好吧,如果我没有参数,是否有可能获得第一种方法工作,但其余的保持不变? – Ash
不,无论您是否使用该参数都是必需的。我不明白你为什么要删除它 - 它不会让你忽略它。 – Mat