如何从另一个类到达Qt小部件

时间:2013-05-13 19:28:59

标签: qt

我正在实施一个俄罗斯方块。 在Qt Designer中我绘制了一个Frame小部件。 然后我组织了一个继承自该Frame的QtGlass。 因此,在Qt Designer中,它看起来像带有QtGlass类的Object框架。 现在我想让图形在现有的限制范围内移动(墙壁等)。 我正在尝试实现它,如下所示。 好吧,我遇到的事实是我无法访问我的QtGlass对象。 所以,我知道它有一个方法isMovementPossible(),但我不知道如何 使用它。我的QtGlass实例似乎被称为“框架”,但如果我使用此名称, 我收到错误“无法解析识别帧”。

你能帮帮我吗?

QtGlass.h

    #ifndef QTGLASS_H
    #define QTGLASS_H

    #include <QFrame>
    #include "Figure.h"

    class QtGlass : public QFrame {
        Q_OBJECT

    public:
        bool isMovementPossible();

    protected:
        Figure Falcon;
    ...
    }

Figure.cpp

#include "Figure.h"
#include "QtGlass.h"
#include <QtGui>
#include <QtGui/QApplication>

void Figure::set_coordinates(int direction) {
    previous_x = current_x;
    previous_y = current_y;
    switch (direction) {
        case 1:
        {//Qt::Key_Left:            
            current_x -= 1;
            if (frame->isMovementPossible()) {
                break;
            }
            current_x += 1;
            break;
        }
...
}

1 个答案:

答案 0 :(得分:0)

要在Figure方法中访问,frame变量必须是全局变量或Figure类(或超类)的成员。

如果您需要访问QtGlass实例中的Figure实例,则需要向其传递引用(或指针)。您可以在构造它时将其传递给Figure(假设帧比图更长)或将其作为参数传递给需要它的方法。

例如,如果您的框架总是超过其中的数字,那么您可以简单地执行类似

的操作
class QtGlass; // forward declare to avoid circular header include

class Figure
{
public:
    Figure( const QtGlass& glass ) : frame( glass ) {}

    void set_coordinates(int direction) {
        // ...
        if (frame.isMovementPossible()) {
            break;
        }
        // ...
    }

    // other methods...

private:
    const QtGlass& frame;
    // other members...
};

并且您的QtGlass构造函数可以执行

QtGlass::QtGlass( QWidget* parent )
    : QFrame( parent )
    , Falcon( *this )
{
}

或者,如果在施工时设置它不方便,您可以使用专用的setter方法在图上设置框架。在这种情况下,成员需要是一个指针(尽管setter仍然可以通过引用传递)。