Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何访问QGridLayout中的小部件坐标_C++_Qt_Coordinates_Qgridlayout - Fatal编程技术网

C++ 如何访问QGridLayout中的小部件坐标

C++ 如何访问QGridLayout中的小部件坐标,c++,qt,coordinates,qgridlayout,C++,Qt,Coordinates,Qgridlayout,我正在将QLabel放入QGridLayout中,以便将它们很好地安排在从QWidget派生的类中。但是,当我尝试访问坐标时,它总是返回(0,0) 这是我的密码: class brick : public QWidget { Q_OBJECT public: explicit brick(QWidget *parent); ... private: QLabel* label; QPixmap* brickPic; } brick::brick(QWidget

我正在将QLabel放入QGridLayout中,以便将它们很好地安排在从QWidget派生的类中。但是,当我尝试访问坐标时,它总是返回(0,0)

这是我的密码:

class brick : public QWidget
{
Q_OBJECT
public:
    explicit brick(QWidget *parent);
    ...
private:
    QLabel* label;
    QPixmap* brickPic;
}

brick::brick(QWidget *parent) :
QWidget(parent)
{
rect=new QRect();
label=new QLabel;
brickPic=new QPixmap(100,15);
brickPic->fill(QColor(255,0,0));
label->setPixmap(*brickPic);
}

class Grid : public QWidget
{    
QOBJECT
public:
    void fill_grid(QWidget* parent);
    ...
private:
    QGridLayout* grid;
}
void Grid::fill_grid(QWidget* parent)
{
for (int i=0;i<10;i++)
{
    for (int j=0;j<12;j++)
    {
        brick* fillingBrick=new brick(parent);
        grid->addWidget(fillingBrick->getLabel(),j,i);
        qDebug()<<fillingBrick->parentWidget();
        brickVector.push_back(fillingBrick);
    }
}
}

窗口小部件的位置和大小由布局决定,并在您调用窗口小部件上的
show()
之后以及该窗口可见之前的某个时间,在事件循环的调用中计算

因为您想要实现一个破砖游戏,所以有两种方法:

  • 使用图形视图/场景系统

  • 像你想做的那样使用小部件

  • 您基于widget的方法很好地证明了问题的解决方案可以通过根本不检查砖块位置自然地解决

    您将在计时器事件中或使用动画系统更新球的位置。在任何一种情况下,ball小部件都将收到一个带有新位置的
    moveEvent
    。在这里,您可以轻松地计算球矩形与每个砖块小部件矩形的交点。因为它们是同一父对象的子对象,所以它们将位于同一坐标系中。届时,所有职位都将是当前职位。在检测到碰撞后,您将反映球的方向,并从字面上删除砖块小部件。您还可以开始播放“hit”音效


    使用
    QObject
    属性系统根据不同的brick小部件的行为特征来标记它们是相当容易的。所有这些都可以在不必对基本小部件进行子类化的情况下完成,例如,
    QFrame

    我确实在qt文档中看到,在调用show()之前,pos给出了错误的坐标。我有一个Qt定时器用来更新我的渲染区域,并试图在循环中获得砖块的pos(),但没有运气(QPoint(0,0)),我在第一篇文章中添加了循环。谢谢你为我指路,真的很有帮助。谢谢你为我指路,真的很有帮助。据我所知,我可以得到球被画在其中的矩形,并检查这个矩形是否与砖矩形相交。还有一件事我没有放弃:我应该在每次计时器更新时检查十字路口吗?如果是这样的话,这张支票对整个系统来说是不是有点过分了?另外,我的球是在一个QPainter
    drawerlipse
    中绘制的,有没有办法获得绘制它的矩形(可能是使用
    childrenRect
    ),或者我应该在render_area类中将它实现为一个属性?“这个检查对系统来说不是很难”一点也没有。每场比赛都是这样。“检查”可能相当于几百个整数比较。“我的球是在QPainter抽屉里画的”球应该是一个完全用椭圆填充的小部件:
    painter.抽屉(rect())
    。请注意,
    rect()
    始终是
    QRect(0,0,width(),height())
    。然后很容易计算它与任何其他小部件的交集。“迭代将砖块作为子部件的小部件的子部件”使用
    findChildren
    方法获得子部件列表,然后查看该列表并找到与球相交的小部件,然后删除该小部件。就这些。你好,谢谢你编辑我的帖子(我不熟悉这个帖子的语法)和你的快速回答。我正试图做一个砖块破坏游戏,我需要我的砖块坐标,以便检测与球的碰撞。这是我现在所拥有的
    class render_area : public QWidget
    {
    Q_OBJECT
    public:
        render_area(QWidget *parent = 0);
        Grid* getGrid() const;
        ...
    private:
        Grid* grid;
        QRect* bar;
        ...
    }
    
    render_area::render_area(QWidget *parent)
    :QWidget(parent)
    {
        setFocusPolicy(Qt::StrongFocus);
        setBackgroundRole(QPalette::Base);
        setAutoFillBackground(true);
    
        bar=new QRect(width()/2,height()+50,150,10);
        grid=new Grid(this);
        grid->fill_grid(this);
        std::cout<<"Grid filled !"<<std::endl;
    
        qDebug()<<grid->getBrick(5)->pos();
        ...
    }
    
    void render_area::update_timer()
    {
    int x1,x2,y1,y2;
    bar->getCoords(&x1,&y1,&x2,&y2);
    
    if(is_fixed==false)
    {
        //gestion du sol
        if(yc+diametre>height())
        {
            timer.stop();
            QDialog* gameOver=new QDialog;
            gameOver->setLayout(new QGridLayout);
            gameOver->layout()->addWidget(new QPushButton("Ok"));
            gameOver->setGeometry(500,500,300,150);
            gameOver->show();
        }
    
        if(xc>x1 && xc<x1+150)
        {
            if(yc+diametre>y1)
            {
                vyc=-vyc;
            }
        }
        //plafond
        for (int i=0;i<12;i++)
        {
            for(int j=0;j<10;j++)
            {
                grid->getBrick(i,j)->setRect(grid->getGrid()->cellRect(i,j));
            }
        }
    
        for(int i=0;i<widgets.size();i++)
        {
                if(widgets.at(i)->getRect()->intersects(ballRectangle))
                {
                    std::cout<<i<<std::endl;
                    widgets.at(i)->getPixmap()->fill(QColor(255,255,255));
                    widgets.at(i)->getLabel()->setPixmap(*(widgets.at(i)->getPixmap()));
                    delete widgets.at(i);
                    vyc=-vyc;
                }
                //qDebug()<<grid->getBrick(i,j)->getRect();
        }
        //bord droit
        if(xc+diametre>width())
        {
                vxc=-vxc;
        }
    
        //bord gauche
        if(xc<0)
        {
                vxc=-vxc;
        }
    
        //integration (Euler explicite)
        xc=xc+dt*vxc;
        yc=yc+dt*vyc;
    
    }
    repaint();
    }