刚接触QT,弱弱的问一句

chinayangbo2011 2013-03-25 04:05:18
#include <QApplication>
#include <QWidget>
#include <QPainter>
class MyMainWindow:public QWidget
{
public:
MyMainWindow(QWidget *parent = 0);
private:
void paintEvent(QPaintEvent *);
QPainter *paint;
};


void MyMainWindow::paintEvent(QPaintEvent *)

//paintEvent函数由系统自动调用,用不着我们人为的去调用。
{
paint=new QPainter;
paint->begin(this);
paint->setPen(QPen(Qt::blue,4,Qt::DashLine)); //设置画笔形式
paint->setBrush(QBrush(Qt::red,Qt::SolidPattern)); //设置画刷形式
paint->drawRect(20,20,160,160);
paint->end();
}


MyMainWindow::MyMainWindow(QWidget *parent):QWidget(parent)
{
setGeometry(100,100,200,200);
}


int main(int argc,char **argv)
{
QApplication a(argc,argv);
MyMainWindow w;
w.show();
return a.exec();
}

主函数也没有调用paintEvent这个函数,paintEvent只是个成员函数,要想运行,在主函数里面应该调用这个成员函数才能执行啊。为什么没有调用也能执行呢?


...全文
237 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
嵌入式农民工 2013-03-26
  • 打赏
  • 举报
回复
引用 10 楼 chinayangbo2011 的回复:
paintEvent函数是不是就相当于是一个虚函数
paintEvent函数本来就是一个虚函数。
chinayangbo2011 2013-03-26
  • 打赏
  • 举报
回复
paintEvent函数是不是就相当于是一个虚函数
chinayangbo2011 2013-03-26
  • 打赏
  • 举报
回复
有道理,很对 thanks
chinayangbo2011 2013-03-26
  • 打赏
  • 举报
回复
引用 12 楼 frjmimi 的回复:
类的三大特性你都没搞清楚,问个毛啊
我都说我刚接触QT了,看来你很马虎
frjmimi 2013-03-26
  • 打赏
  • 举报
回复
他么的这和虚函数有什么关系? Qt的事件基本都是被底层封装好的,信号和槽已经代替了其他语言普通的事件了, void Widget::paintEvent(QPaintEvent *)中paintEvent这个函数是由Widget这个类自己定义好的或者是从父类继承来的,当有QPaintEvent类型的事件发生时,就会自动调用这个函数,怎么调用你不需要知道,你只需要知道的是,这个QPaintEvent类型的事件发生后要做什么,这就是由你在函数体里写的代码确定的
frjmimi 2013-03-26
  • 打赏
  • 举报
回复
类的三大特性你都没搞清楚,问个毛啊
嵌入式农民工 2013-03-25
  • 打赏
  • 举报
回复
既然来了,就说说我看法吧。 paintEvent(QPaintEvent *)是一个事件函数,不需要你显示调用,在相应事件发生后,qt框架自己会调用它。 下面是QWidget的事件函数中paintEvent部分。 bool QWidget::event(QEvent *event) { …… switch (event->type()) { …… case QEvent::Paint: // At this point the event has to be delivered, regardless // whether the widget isVisible() or not because it // already went through the filters paintEvent((QPaintEvent*)event); break; …… } } QEvent::Paint是定义在QEvent里的一个枚举类型Type中一个值。 而底层的事件是通过qt的事件循环来获得的。
jdwx 2013-03-25
  • 打赏
  • 举报
回复
原来就有一个paintevent函数被其它函数调用,你只不过重新写了一个替换掉原来的那个。
嵌入式农民工 2013-03-25
  • 打赏
  • 举报
回复
不好意思,回错地方了。
嵌入式农民工 2013-03-25
  • 打赏
  • 举报
回复
QPoint oldPos; bool press; void mousePressEvent(QMouseEvent *event) { if(event->button() == Qt::LeftButton) { oldPos = event->globalPos(); press = true; } } void mouseMoveEvent(QMouseEvent *event) { if (press) { this->move(this->pos() + event->globalPos() - oldPos); oldPos = event->globalPos(); } } void mouseReleaseEvent(QMouseEvent *event) { press = false; }
chinayangbo2011 2013-03-25
  • 打赏
  • 举报
回复
show函数会默认调用所有的成员函数吗?
chinayangbo2011 2013-03-25
  • 打赏
  • 举报
回复
#ifndef WIDGET_H #define WIDGET_H #include <QtGui/QWidget> class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent = 0); ~Widget(); protected: void paintEvent(QPaintEvent *); }; #endif // WIDGET_H #include "widget.h" #include <QPainter> #include <QPoint> #include <QTimer> #include <QTime> static QPoint sed[4]={QPoint(0,-70),QPoint(2,0),QPoint(0,10),QPoint(-2,0)}; static QPoint min[4]={QPoint(0,-50),QPoint(6,0),QPoint(0,13),QPoint(-6,0)}; static QPoint hour[4]={QPoint(0,-40),QPoint(4,0),QPoint(0,11),QPoint(-4,0)}; Widget::Widget(QWidget *parent) : QWidget(parent) { QTimer *timer=new QTimer(this); timer->start(1000); connect(timer,SIGNAL(timeout()),this,SLOT(update())); resize(200,200); } Widget::~Widget() { } void Widget::paintEvent(QPaintEvent *) { QPainter paint(this); QTime time=QTime::currentTime(); paint.translate(100,100); paint.setRenderHints(QPainter::Antialiasing); paint.setBrush(Qt::blue); paint.setPen(Qt::red); paint.save(); paint.rotate(6.0*time.second()); paint.drawConvexPolygon(sed,4); paint.restore(); paint.setBrush(Qt::blue); paint.setPen(Qt::blue); paint.save(); paint.rotate(6.0*(time.minute()+time.second()/60.0)); paint.drawConvexPolygon(min,4); paint.restore(); paint.setBrush(Qt::black); paint.setPen(Qt::black); paint.save(); paint.rotate(30.0*(time.hour()+time.minute()/60.0)); paint.drawConvexPolygon(hour,4); paint.restore(); for(int i=0;i<12;i++) { paint.rotate(30); paint.drawLine(0,-98,0,-88); } } #include <QtGui/QApplication> #include "widget.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.show(); return a.exec(); } 那这个主函数也没有调用成员函数paintEvent,但是它也会执行,也是系统自动调用的吗?关键是系统是怎么调用的,系统怎么知道要调用它呢?
蜡笔小新啦 2013-03-25
  • 打赏
  • 举报
回复
你调用了show函数。
qt初体验 2013-03-25
  • 打赏
  • 举报
回复
你用这是系统自带的 你本身不用调用 ,窗口显示的时候会自动调用的

16,203

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧