如何访问QGridLayout中的小部件坐标
How to access widgets coordinates in 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 *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);
}
}
}
这些将像我之前所说的那样显示在以下从QWidget派生的类中:
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();
...
}
qDebug()<<fillingBrick->parentWidget()
返回良好的render_area
,而qDebug()<<grid->getBrick(5)->pos()
返回不良的QPoint(0,0)
。
我想知道如何让pos()
或x()
和y()
返回render_area
中的坐标,其中每个砖都放置在其中。我尝试了从QGridLayout的cellRect
,从QWidget继承的MapToParent()
,迫使render_area
到show();
,但到目前为止没有运气。
编辑:这就是我说的循环:
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();
}
小部件的位置和大小由布局决定,并在事件循环调用中计算,有时在调用窗口小部件上的show()
之后,有时在该窗口变得可见之前。
既然你想实现一个破砖游戏,有两种方法:
-
使用图形视图/场景系统
您基于小部件的方法很好地证明了您的问题的解决方案可以通过而不是检查砖的位置来自然解决。
你将在一个计时器事件中更新球的位置,或者使用动画系统。在任何一种情况下,球小部件都将收到一个具有新位置的moveEvent
。在这里,您可以轻松地计算球矩形与每个砖小部件矩形的交点。因为它们是同一个父结点的子结点,所以它们将在同一个坐标系中。到那时,所有的职位都将是当前的。在检测到碰撞后,您将反射球的方向,并真正地delete
砖小部件。你也可以开始播放"hit"的音效。
使用QObject
属性系统来标记不同的砖部件是相当容易的,这取决于它们的行为特征。所有这些都可以完成,而无需子类化基小部件,例如可以是QFrame
。
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 最小硬币更换问题(自上而下方法)
- Qt VTK交互风格的信号到小部件
- QGraphicsPolygonItem在拖动时未更新QPolygonF坐标
- 芬威克树(BIT).找到具有给定累积频率的最小索引,单位为 O(logN)
- 如何在Qt窗口小部件中使用QStringView(或QStringRef)
- 使用递归的数组的最小值.这是怎么回事
- 为什么在浮点中从大到小会引入更多的误差
- 找到两对数字,使它们的乘积的绝对差最小化
- 在C++中使用GDAL可以将图像的像素坐标转换为lat,long吗
- UE4-如何在给定4个屏幕坐标的情况下缩放纹理或材质
- 如何使用boost::具有嵌套结构和最小代码更改的序列化
- 最大和最小 1 C++函数
- 如何创建一个函数来计算并返回平均值、最大值和最小值
- 我可以做些什么来消除或最小化这种将提供相同功能和行为的代码重复
- 最小二乘多项式拟合仅适用于偶数个坐标
- C++ 创建小部件数组
- 坐标最小距离 C++
- 如何访问QGridLayout中的小部件坐标
- 与包含拇指小部件的滑块小部件的相对坐标