我创建了一个自己的GridPushButton类来存储gridlayout中的按钮位置。父母是QPushButton
。在窗口中询问它的x和y坐标时遇到问题(如x:654,y:768)。我以为它将继承自基类,但事实并非如此。现在我有两个选择:
使用原始的QPushButton
类并以某种方式获取它在gridlayout中的位置(如x:0,y:1,如果它在第一行和第二列中)或
使用我的GridPushButton并以某种方式获取窗口中的x和y坐标。
class GridPushButton : public QPushButton
{
Q_OBJECT
public:
GridPushButton(int coordX, int coordY, QWidget *parent = 0);
int coordinateX() { return _coordX; }
int coordinateY() { return _coordY; }
protected:
int _coordX;
int _coordY;
};
这是我的班级。我尝试创建一个新的私有变量并将其赋予QPushButton::x()
,但不起作用。有没有想过从父母那里获得x和y坐标?
或者有任何想法在GridLayout中获得QPushButtons
位置?
答案 0 :(得分:6)
有两种坐标概念可供您混合使用。父窗口小部件中有位置。这可以通过QWidget::x()
,QWidget::y()
和QWidget::pos()
方法获得。你不需要在这里实现任何东西:它已经有效了。
然后是网格布局中行和列的概念。这可以在不需要任何子类化的情况下获得。网格布局知道其小部件的位置,您可以简单地询问它是否有任何小部件的行/列位置。
#include <QApplication>
#include <QGridLayout>
#include <QPushButton>
#include <QLabel>
QPair<int,int> gridPosition(QWidget * widget) {
auto gp = qMakePair(-1,-1);
if (! widget->parentWidget()) return gp;
auto layout = dynamic_cast<QGridLayout*>(widget->parentWidget()->layout());
if (! layout) return gp;
int index = layout->indexOf(widget);
Q_ASSERT(index >= 0);
int rs,cs;
layout->getItemPosition(index, &gp.first, &gp.second, &rs, &cs);
return gp;
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QWidget w;
QGridLayout l(&w);
QLabel gridPos;
l.addWidget(&gridPos, 0, 0, 1, 4);
for (int i = 1; i < 4; ++ i)
for (int j = 0; j < 3; ++ j) {
auto b = new QPushButton(QString("%1,%2").arg(i).arg(j));
l.addWidget(b, i, j);
QObject::connect(b, &QPushButton::clicked, [&gridPos, b]{
auto p = gridPosition(b);
gridPos.setText(QString("Grid Pos: %1,%2")
.arg(p.first).arg(p.second));
});
}
w.show();
return a.exec();
}