QT 小部件指针

Posted

技术标签:

【中文标题】QT 小部件指针【英文标题】:QT Widget Pointer 【发布时间】:2012-10-15 22:06:49 【问题描述】:

我对 QT 还很陌生,并且正在努力获得一个基本的绘画示例来工作。我正在创建一个游戏,我在我的主游戏控制器中实例化一个小部件。我想将此传递给多个不同的对象,以便每个对象都可以拥有自己的paintEvent 并相应地绘制其对象。 (IE,角色会单独画,风景等)

这是我的“动画对象”标题:

class Animated_object: public QWidget 

    public:
        Animated_object(char * _image_url, QWidget * window);
        ~Animated_object();

    protected:
        QImage * get_image();//this will return the image for this object
        QRect * get_rectangle();//this will return the rectangle of coordinates for this point


    protected:
        virtual void paintEvent(QPaintEvent * event) = 0;
        virtual void set_image(char * _image_url) = 0;


    protected:
        QWidget * window;
        char * image_url;//this is the imageurl
        QImage * image;
        QRect * rectangle;

;

我的动画对象构造器:

Animated_object::Animated_object(char * _image_url, QWidget * _window) : QWidget(_window) ....

这是我的角色标题(角色继承自动画对象)

class Character : public Animated_object 

    public:
        Character(QWidget * _window);   
        ~Character();
        void operator()();//this is the operator for the character class -- this is responsible for running the character
        void set_image(char * _image_url) ;
        void paintEvent(QPaintEvent * event);

;

我通过将我的主小部件指针传递给构造函数来实例化一个字符。所以我有另一个可以调用多个字符的类,它们都会绘制到同一个小部件(希望如此)。

我的角色paintEvent看起来像这样:

void Character::paintEvent(QPaintEvent * event) 

    QPainter painter(this);//pass it in window to ensure that it is painting on the correct widget!

    cout << "PAINT EVENT " << endl;
    QFont font("Courier", 15, QFont::DemiBold);
    QFontMetrics fm(font);
    int textWidth = fm.width("Game Over");

    painter.setFont(font);

    painter.translate(QPoint(50, 50));
    painter.drawText(10, 10, "Game Over");


它正在被调用,(我使用 std::cout 来测试它)但没有画任何东西......

最后,这里是我的主要小部件被调用的地方。

Hill_hopper::Hill_hopper(): Game(500,500, "Hill Hopper") 

    Character * character = new Character(window);

    window->show();
    application->exec();



这是游戏构造函数:

Game::Game(int _height, int _width, char * title): height(_height), width(_width) 


    int counter = 0;
    char ** args;


    application = new QApplication(counter, args);

    window = new QWidget();

    desktop = QApplication::desktop();

    this->set_parameters(title);


任何帮助将不胜感激

【问题讨论】:

让我们看看你的“主要小部件”部分,你在其中创建了一个角色Character *character=new Character(this);,然后调用character-&gt;show(); 【参考方案1】:

您的标题中似乎缺少 Q_OBJECT 宏。虽然如果它被调用,这可能不是问题。

无论如何,我建议你使用 Qt Creator 创建新类,它会为你创建 .h 和 .cpp 文件骨架,避免忘记这样的东西。

对于快速更新的游戏,您可能应该只有一个游戏区域小部件,您可以在其中绘制所有移动的东西。如果您只绘制 QPixMaps(没有直接的文本或线条绘制,首先将文本片段转换为 QPixmaps),那么只需将小部件转换为 QGLWidget 即可非常快速地旋转和缩放 QPixMap“精灵”,而无需自己编写任何 OpenGL 代码。但是如果建议的 QGraphicsView 足够快,那么如果对你有用,它会做很多事情,你应该先尝试一下。

【讨论】:

【参考方案2】:

您应该使用为这种想法设计的QGraphicsView 小部件。在 QGraphicsView 的场景 (QGraphicsScene) 中,您可以直接添加小部件。内置系统将管理您的小部件并在需要时触发绘制事件。 此外,您还有很多有用的功能可以查找、移动等您的小部件。

【讨论】:

您好,请问有教程链接吗?我正在尝试找到一种将这些小部件集成到场景中的好方法,但似乎无法使任何工作。谢谢 我第二个需要切换到 QGraphicsView 框架,而不是创建 QWidgets。 This is the best QGraphicsView tutorial。还有"official" one。

以上是关于QT 小部件指针的主要内容,如果未能解决你的问题,请参考以下文章

具有透明背景的 Qt 小部件

如何使Qt小部件可调整大小[重复]

Qt 在另一个小部件中调整小部件的大小

qt - 在父窗口/小部件类中初始化子小部件的目的是啥?

Qt 调用另一个 UI

具有单独布局的嵌套 Qt 小部件