找回密码
 立即注册
收起左侧

qt运行原理

12
回复
11195
查看
[复制链接]
累计签到:19 天
连续签到:1 天
来源: 2015-7-15 21:37:36 显示全部楼层 |阅读模式
1Qter豆
刚接触qt,看了2天后,开始接触贪吃蛇例程。差不多理解了之后,理思路的时候,突然发现这几个cpp文件执行有先后顺序么,= =可能还是c的思维。有些函数都没看到调用,其中的boundingrect和paint我都没看到调用啊,是怎么执行的?卡在这了,语法什么的有c的基础,没有什么大问题。感觉是思路的问题。

最佳答案

查看完整内容

那些都是方法实现,,至于什么时候调用那些方法,可以自己调用,也可以等待触发那些方法
回复

使用道具 举报

累计签到:615 天
连续签到:1 天
2015-7-15 21:37:37 显示全部楼层
qq1043068972 发表于 2015-7-16 19:20
我貌似明白你的困惑了,是这样,,QT是界面和类单位运行的,main只有一个类(你整个程序),然后创建了一 ...

那些都是方法实现,,至于什么时候调用那些方法,可以自己调用,也可以等待触发那些方法
回复

使用道具 举报

累计签到:256 天
连续签到:1 天
2015-7-16 09:17:37 显示全部楼层
Qt上面用C++比较多一点,然后C++是面向对象的,感觉就是吧需要的玩意封装调用,C更多的思维就是自己去实现某种功能,全部自己写代码实现。Qt里面封装了很多类
回复

使用道具 举报

累计签到:19 天
连续签到:1 天
2015-7-16 10:04:11 显示全部楼层
z55716368 发表于 2015-7-16 09:17
Qt上面用C++比较多一点,然后C++是面向对象的,感觉就是吧需要的玩意封装调用,C更多的思维就是自己去实现 ...

恩,封装是看到了。不过是有几个成员函数并没有看到调用,但是注释掉之后又会出错。
回复

使用道具 举报

累计签到:615 天
连续签到:1 天
2015-7-16 11:38:10 显示全部楼层
你在cpp文件里搜下那几个成员名看看啊!
回复

使用道具 举报

累计签到:19 天
连续签到:1 天
2015-7-16 11:43:01 显示全部楼层
qq1043068972 发表于 2015-7-16 11:38
你在cpp文件里搜下那几个成员名看看啊!

cpp中可以看到啊 ,类作用域::函数。看不到哪里调用

点评

啥意思,既然cpp中都可以看到了,,不就能看到在哪里调用了吗?成员不都是在.h,,调用在cpp中吗?  详情 回复 发表于 2015-7-16 11:49
回复

使用道具 举报

累计签到:615 天
连续签到:1 天
2015-7-16 11:49:35 显示全部楼层
seasidemym 发表于 2015-7-16 11:43
cpp中可以看到啊 ,类作用域::函数。看不到哪里调用

啥意思,既然cpp中都可以看到了,,不就能看到在哪里调用了吗?成员不都是在.h,,调用在cpp中吗?
回复

使用道具 举报

累计签到:19 天
连续签到:1 天
2015-7-16 11:54:00 显示全部楼层
qq1043068972 发表于 2015-7-16 11:49
啥意思,既然cpp中都可以看到了,,不就能看到在哪里调用了吗?成员不都是在.h,,调用在cpp中吗? ...

看下这个
Food::Food(qreal x, qreal y)
{
    setPos(x, y);
    setData(GD_Type, GO_Food);//..
}

QPainterPath Food::shape() const
{
    QPainterPath p;
    p.addEllipse(QPointF(TILE_SIZE / 2, TILE_SIZE / 2), FOOD_RADIUS, FOOD_RADIUS);
    return p;
}

void Food::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *)
{
    painter->save();

    painter->setRenderHint(QPainter::Antialiasing);
    painter->fillPath(shape(), Qt::red);

    painter->restore();//->在指针中使用,.在结构体中使用
}

QRectF Food::boundingRect() const
{
    return QRectF(-TILE_SIZE,    -TILE_SIZE,
                   TILE_SIZE * 2, TILE_SIZE * 2 );
}
这是food.cpp的内容。。我的疑问是,我可以看到paint中调用了shape(),但是找不到哪里调用paint和boundingrect。是这个意思。其他几个cpp中也没有调用此处的paint.
回复

使用道具 举报

累计签到:615 天
连续签到:1 天
2015-7-16 11:58:00 显示全部楼层
这些都是food类方法的实现,不是调用啊,你看看其他cpp中有没有调用paint和boundingrect方法
回复

使用道具 举报

累计签到:19 天
连续签到:1 天
2015-7-16 13:26:04 显示全部楼层
qq1043068972 发表于 2015-7-16 11:58
这些都是food类方法的实现,不是调用啊,你看看其他cpp中有没有调用paint和boundingrect方法 ...

没找到,所以分不清程序的入口。看另外一个简单的
mainwindow.cpp
ainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    resize(800, 600);
    setWindowTitle(tr("Paint Demo"));
}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.drawLine(80, 100, 650, 500);
    painter.setPen(Qt::red);
    painter.drawRect(10, 10, 100, 400);
    painter.setPen(QPen(Qt::green, 5));
    painter.setBrush(Qt::blue);
    painter.drawEllipse(50, 150, 400, 200);
}
main.cpp
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}
那个paintEvent是何时调用的,我感觉2者是一样的问题。可能不太理解qt的机制吧,刚看3天。

点评

我貌似明白你的困惑了,是这样,,QT是界面和类单位运行的,main只有一个类(你整个程序),然后创建了一个对象,show这个对象,,怎么说呢,,如果你以前没接触过面向对象,我建议你再去好好理解下面向对象! 我的  详情 回复 发表于 2015-7-16 19:20
回复

使用道具 举报

累计签到:615 天
连续签到:1 天
2015-7-16 19:20:40 显示全部楼层
seasidemym 发表于 2015-7-16 13:26
没找到,所以分不清程序的入口。看另外一个简单的
mainwindow.cpp
ainWindow::MainWindow(QWidget *paren ...

我貌似明白你的困惑了,是这样,,QT是界面和类单位运行的,main只有一个类(你整个程序),然后创建了一个对象,show这个对象,,怎么说呢,,如果你以前没接触过面向对象,我建议你再去好好理解下面向对象!
我的水平也很有限,能明白,但是解释不清楚

点评

那些都是方法实现,,至于什么时候调用那些方法,可以自己调用,也可以等待触发那些方法  详情 回复 发表于 2015-7-16 19:21
回复

使用道具 举报

累计签到:23 天
连续签到:1 天
2015-7-18 15:37:07 显示全部楼层
他应该对C++语法不是很了解!我建议先学学C++然后再研究qt!
回复

使用道具 举报

累计签到:109 天
连续签到:1 天
2016-1-15 11:09:30 显示全部楼层
我也刚接触Qt不久,也一直被这个问题困扰,不知道之前的人都没有这样的困惑吗?还是不愿意讲故意装高深?还是我们太笨了?我是看了几个月的C++ 之后才看的Qt,对于面向对象编程,我粗浅的理解,无非就是“封装了数据(private/protect  数据与函数)、留了接口(public数据与函数) ”而已。对Qt的这种困惑(没看到函数调用,但是函数确实执行了)根本不是不理解面向对象的思想而导致的,我觉得是不理解Qt背后的调用机制导致的。任何语言 函数的调用时必须的,否则函数永远不会执行。

所以,我对 boundingRect ,paint的理解是这样的:你在Qt帮助里搜一下,会发现他们都是pure virtual函数(在QGraphicsItem类里找),也就是说,它们是没有实现的,只是个接口,需要我们按照它们的函数形式,自己写代码完成所需的功能。Food类 是继承自 QGraphicsItem的类,所以Food类也包含了 这些函数,因为没有实现,所以必须自己写代码来实现。

那么它们是什么时候被调用的呢? 我觉得是 无非是在 “构造”或者 “ 事件触发"的时候被调用了。这个Food总是要画出来的,所以可能是类似于一个”画图事件“被触发的时候,这些函数被Qt调用了,知识调用过程隐藏了,降低了我们错误调用的机会(可也增加了我这种小白的困惑啊。。)。对于各种事件(比如鼠标事件,键盘事件等)的分发,好像是event函数控制的,event函数判断是什么事件,然后调用相应的事件处理函数,比如mouseMoveEvent() 什么的。至于这些事件到底什么时候触发,怎么被触发(尤其是二维绘图这块儿)的,我也是云里雾里的。

有机会大家一起交流啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了