1

何かを行う「推奨」方法を回避しようとして、面倒な時間を過ごしています。

だから、私はカードのスタックを持っています。カードを配ったときに、シーン全体の最後に描かれたオブジェクトになるようにしたい (典型的なbring_to_front機能)。

これを行うための推奨される方法はzValue、残りのすべてよりも大きくなるまでオブジェクトに追加することですがstackBefore、再編成をシミュレートするメソッドを賢明に使用して、あちこちで実行されているかなり「怠惰な」整数をなくしたいと考えていました。オブジェクトがシーンに追加された順序。

これは、限られたセットでカードをシャッフルするときに完全に正常に機能します (アイテム do item.stackBefore(next item) に対して、選択したアイテムのリスト、random.shuffle を取得します)。シーン全体の上部。

オブジェクトのコピーをシーンに追加してからオリジナルを削除することを検討しましたがstackAfter、Python リスト (insertAtまたは何か) を使用するときと同じようにできるはずです。

サンプルコード:

  def deal_items(self):
    if not self.selection_is_stack():
      self.statusBar().showMessage("You must deal from a stack")
      return

    item_list = self.scene.sorted_selection()
    for i,item in enumerate(item_list[::-1]):
      width = item.boundingRect().width()
      item.moveBy(width+i*width*0.6,0)

      another_list = self.scene.items()[::-1]
      idx = another_list.index(item)
      for another_item in another_list[idx+1:]:
        another_item.stackBefore(item)

これは機能します。やや… 醜いようです。

4

1 に答える 1

1

self.scene.items積み上げ順でアイテムを返します (リンク)。したがってstackAfter、アイテムが必要な場合は、現在の一番上のアイテムの z 値を照会してから、新しい一番上のカードの z 値を 1 つ大きい値に設定できます。

item.setZValue(self.scene.items().first().zValue() + 1)

それが役立つことを願っています。

http://gitorious.org/qt/stackBeforeとの間で追加された src を編集setZValueします。 src/gui/graphicsview/qgraphicsitem.cpp

void QGraphicsItem::stackBefore(const QGraphicsItem *sibling)
{
    if (sibling == this)
        return;
    if (!sibling || d_ptr->parent != sibling->parentItem()) {
        qWarning("QGraphicsItem::stackUnder: cannot stack under %p, which must be a sibling", sibling);
        return;
    }
    QList<QGraphicsItem *> *siblings = d_ptr->parent
                                       ? &d_ptr->parent->d_ptr->children
                                       : (d_ptr->scene ? &d_ptr->scene->d_func()->topLevelItems : 0);
    if (!siblings) {
        qWarning("QGraphicsItem::stackUnder: cannot stack under %p, which must be a sibling", sibling);
        return;
    }

    // First, make sure that the sibling indexes have no holes. This also
    // marks the children list for sorting.
    if (d_ptr->parent)
        d_ptr->parent->d_ptr->ensureSequentialSiblingIndex();
    else
        d_ptr->scene->d_func()->ensureSequentialTopLevelSiblingIndexes();

    // Only move items with the same Z value, and that need moving.
    int siblingIndex = sibling->d_ptr->siblingIndex;
    int myIndex = d_ptr->siblingIndex;
    if (myIndex >= siblingIndex) {
        siblings->move(myIndex, siblingIndex);
        // Fixup the insertion ordering.
        for (int i = 0; i < siblings->size(); ++i) {
            int &index = siblings->at(i)->d_ptr->siblingIndex;
            if (i != siblingIndex && index >= siblingIndex && index <= myIndex)
                ++index;
        }
        d_ptr->siblingIndex = siblingIndex;
        for (int i = 0; i < siblings->size(); ++i) {
            int &index = siblings->at(i)->d_ptr->siblingIndex;
            if (i != siblingIndex && index >= siblingIndex && index <= myIndex)
                siblings->at(i)->d_ptr->siblingOrderChange();
        }
        d_ptr->siblingOrderChange();
    }
}

void QGraphicsItem::setZValue(qreal z)
{
    const QVariant newZVariant(itemChange(ItemZValueChange, z));
    qreal newZ = newZVariant.toReal();
    if (newZ == d_ptr->z)
        return;

    if (d_ptr->scene && d_ptr->scene->d_func()->indexMethod != QGraphicsScene::NoIndex) {
        // Z Value has changed, we have to notify the index.
        d_ptr->scene->d_func()->index->itemChange(this, ItemZValueChange, &newZ);
    }

    d_ptr->z = newZ;
    if (d_ptr->parent)
        d_ptr->parent->d_ptr->needSortChildren = 1;
    else if (d_ptr->scene)
        d_ptr->scene->d_func()->needSortTopLevelItems = 1;

    if (d_ptr->scene)
        d_ptr->scene->d_func()->markDirty(this, QRectF(), /*invalidateChildren=*/true);

    itemChange(ItemZValueHasChanged, newZVariant);

    if (d_ptr->flags & ItemNegativeZStacksBehindParent)
        setFlag(QGraphicsItem::ItemStacksBehindParent, z < qreal(0.0));

    if (d_ptr->isObject)
        emit static_cast<QGraphicsObject *>(this)->zChanged();
}
于 2013-02-26T05:23:47.677 に答える