0

プロジェクトにはQtjambi4.7.1を使用しています。QGraphicsRectItemを拡張するComponentという名前の抽象クラスを作成しました。同じQGraphicsSceneに移動する目的で、コンポーネントフラグを設定しました。

public abstract class Component extends QGraphicsRectItem{

 public Signal1<QPoint>  componentMoved = new Signal1<QPoint>();
 private int id;
 private int nextId;
 private List<Route> routes = new ArrayList<Route>();
 protected QPixmap image;
 protected static QSizeF size = new QSizeF(100, 100);    

public Component(int pointX1, int pointY1, int id) {

    super(new QRectF(new QPointF(pointX1,pointY1),size));       
    this.id = id;


    //this.setFlag(GraphicsItemFlag.ItemIsSelectable, true);
    this.setFlag(GraphicsItemFlag.ItemIsMovable,true);

    this.setFlag(GraphicsItemFlag.ItemSendsGeometryChanges, true);      
    this.setCacheMode(CacheMode.DeviceCoordinateCache,new QSize(1024,1024));

}

public void drawComponent(){
    new QGraphicsPixmapItem(image.scaled(size.toSize()), this);     
}   

@Override
public void mousePressEvent(QGraphicsSceneMouseEvent e){
    this.setTransformOriginPoint(e.scenePos());
}

@Override
public Object itemChange(GraphicsItemChange change, Object value){
    switch (change) {
    case ItemPositionHasChanged:

        QPointF currentPos = this.scenePos();
        componentMoved.emit(currentPos.toPoint());              
        break;
    default:
        break;
    }       
    return super.itemChange(change, value);
}

public int getId(){
    return id;
}

public int getNextId(){
    return nextId;
}   

public QPixmap getImage(){
    return image;
}

public List<Route> getRoutes(){
    return routes;
}

public QSizeF getSize(){
    return size;
}

public void addRoute(Component nextComponent){
    //routes.add(new Route(this, nextComponent));
}

これで動作し、マウスクリックでシーン内のコンポーネントを移動できるようになりました。ただし、コンポーネントを移動すると、ドラッグするたびに常に初期位置に戻るというバグがあります。簡単なことだと思いますが、インターネットで長い間検索してみましたが、何も見つかりませんでした。

私の悪い英語でごめんなさい!:P

4

1 に答える 1

0

不明な理由でバグは発生しなくなりました。コンポーネントの位置がグラフィックシーンに正しく更新されなかったと思います。そのため、コンポーネントの表示に関連していくつかのコードを変更し、誤ってバグを解決した可能性があります。このバグの正確な原因がわかったら、この投稿を更新します。

于 2012-07-17T17:49:32.997 に答える