如何使qgraphicspixmapitem对象不可被选取
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使qgraphicspixmapitem对象不可被选取相关的知识,希望对你有一定的参考价值。
参考技术A 使用qpainter太判断图片否选 能重写鼠标事件 鼠标点击候判断鼠标位置否图片 我说都觉麻烦 比较便图片放label面显示 通重写label鼠标事件判断否选该图片感觉这样的提问没有什么意义
不要多想,想多了累 参考技术B qgraphicspixmapitem.setFlag(QGraphicsItem.ItemIsSelectable, False)
#设置False后不可选取
qgraphicspixmapitem.setFlag(QGraphicsItem.ItemIsMovable, False)
#设置False后不可移动
Qt:如何使 QGraphicsPixmapItem 在重复路线中自动移动
【中文标题】Qt:如何使 QGraphicsPixmapItem 在重复路线中自动移动【英文标题】:Qt: how to make QGraphicsPixmapItem automatically move in a repeating route 【发布时间】:2018-06-03 08:03:20 【问题描述】:我现在正在制作一个游戏,我希望我的 QGraphicsPixmapItem 在同一条路线上重复地在我的视图之间从左到右和从右到左移动。
更具体一点:
我的敌人从 (0,0) 开始,它从向右 (x()+3) 开始。当它碰到最右边(800,0)时,它会转向左边并继续移动(x()-3)直到 它击中最左边(0,0)。同样,它向右行驶并继续移动 (x()+3) 直到它碰到最右边的 (800,0),它向左转,依此类推,以此类推 同一条路线。
到目前为止,结果是我的物品只停留在最右边,从不移动。
我唯一的线索是它在我的“应用程序输出”中有这个警告,但我想这可能不是这个错误的重点。
libpng 警告:iCCP:已知不正确的 sRGB 配置文件
我是这样编码的,这些是我的想法:
使用“while”来重复移动。
使用 bool 判断在我的物品击中时转动它的移动方向 视图的最右边或最左边。
我的 pixmapitem 的宽度是 100,所以我写 x()+100 以达到 当点击视图的最右侧时它的右侧。(我的视图的宽度是 800)
我有什么遗漏吗?非常感谢任何想法分享或逻辑调试,谢谢!
主窗口.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent):
QMainWindow(parent),
ui(new Ui::MainWindow),
scene(new QGraphicsScene(0,0,800,600)),
enemyMoveTimer(new QTimer)
ui->setupUi(this);
ui->graphicsView->setScene(scene);
//enemy
Enemy * enemy = new Enemy();
enemy->setPixmap(QPixmap(QPixmap(":/img/ghost.gif").scaled(100,100)));
enemy->setPos(0,0);
scene->addItem(static_cast<QGraphicsPixmapItem*>(enemy));
enemyMoveTimer->start(100);
enemy->connect(enemyMoveTimer, SIGNAL(timeout()), enemy, SLOT(enemyMove()));
主窗口.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QGraphicsScene>
#include <QGraphicsPixmapItem>
#include <QTimer>
#include "enemy.h"
namespace Ui
class MainWindow;
class MainWindow : public QMainWindow
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
QGraphicsScene *scene;
QTimer *enemyMoveTimer;
;
#endif // MAINWINDOW_H
敌人.cpp
#include "enemy.h"
Enemy::Enemy()
void Enemy::enemyMove()
while(x()>=0 && x()+100<=800)
if(judge==0)
if (x()+100==800)
judge=1;
else
setPos(x() +3,y());
else if(judge==1)
if (x()==0)
judge=0;
else
setPos(x() -3,y());
敌人.h
#ifndef ENEMY_H
#define ENEMY_H
#include <QObject>
#include <QGraphicsPixmapItem>
#include <QTimer>
class Enemy: public QObject,public QGraphicsPixmapItem
Q_OBJECT
public:
Enemy();
public slots:
void enemyMove();
private:
bool judge = 0;
;
#endif // ENEMY_H
【问题讨论】:
【参考方案1】:我自己突然想通了!!
-->将enemy.cpp中的“while”去掉就可以运行了。
我们不需要while来做重复动作,因为定时器已经重复调用了这个函数。
【讨论】:
以上是关于如何使qgraphicspixmapitem对象不可被选取的主要内容,如果未能解决你的问题,请参考以下文章
QGraphicsPixmapItem - 仅触发顶部对象的事件
如何将到达图形视图右侧(末端)的 QGraphicsPixmapItem 移动到左侧(开始)侧(就像蛇游戏中发生的事情)