看来一篇文章感觉有点问题http://www.cnblogs.com/realid/archive/2013/05/05/3061312.html,于是自己测试了下,终于得到了满意的答案:
widget.h文件
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
protected:
void paintEvent(QPaintEvent *event);
void mouseMoveEvent(QMouseEvent *event);
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
widget.cpp文件
#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
#include <QToolTip>
#include <QMouseEvent>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
setMouseTracking(true);
}
Widget::~Widget()
{
delete ui;
}
void Widget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.setPen(QPen(Qt::red, 3));
painter.setRenderHint(QPainter::Antialiasing);
painter.drawRect(0, 0, 200, 200);
painter.setViewport(0, 0, 200, 200);
painter.drawRect(0, 0,200,200);
}
void Widget::mouseMoveEvent(QMouseEvent *event)
{
QString pos = QString("%1,%2").arg(event->pos().x()).arg(event->pos().y());
QToolTip::showText(event->globalPos(), pos, this);
}
main.cpp
#include <QApplication>
#include "widget.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
新建工程拷贝上面代码,运行,然后拖动,实验一下情形:
1.把窗口拖得跟大矩形一样大(发现小的正好是大的一半)
2.把窗口拖大(小矩形变小)
3.把窗口拖小(小矩形变大)
为什么会这样呢?其实viewport设置的是一个视口(大矩形),他就是窗口(你拖动的那个)的一个映射.比如设置(0,0,200,200),他就将窗口的左上角映射到视口的左上角(0,0),窗口的右下角映射到视口的右下角.
于是当你把窗口拖大,那么小矩形如果画在窗口里,相对于窗口是不是会显得小(比例),但是现在要画在视口里,因为视口大小固定,于是只有把小矩形变小,这样才能体现小矩形和窗口的关系
注意要区别于setWindow(0,0,200,200),他是将视口映射到窗口.二者关系很微妙!需要细心体会...