4

私はにQTreeWidgetItem追加しましたQTreeWidget

QTreeWidgetItem* item = new QTreeWidgetItem(ui->trwPairs);
item->setFlags(item->flags() | Qt::ItemIsEditable);

アイテムが編集されている場合、新しい値をいくつかチェックしたいと思います。

Pairs::Pairs(QWidget *parent) :
QWidget(parent),
  ui(new Ui::Pairs)
{
  ui->setupUi(this);
  connect(this->ui->trwPairs, SIGNAL(itemChanged(QTreeWidgetItem*,int)), this, SLOT(Validate(QTreeWidgetItem*,int)));
}

void Pairs::Validate(QTreeWidgetItem* item, int column)
{
  if (item->text(column).toInt() < 1)
  {
    QMessageBox::critical(this, "Error", QString("Node ID ") + item->text(column) +  " is invalid.");
    ui->trwPairs->editItem(item, column);
  }
}

当然、1未満の場合はそれをキャッチし、メッセージボックスを表示します。ただし、に印刷されcerredit: editing failedアイテムは編集モードではありません。私は何が欠けていますか?

4

4 に答える 4

9

デバッガーでステップスルーすると、次のことがわかります。

quabstractitemview.cppでは、行3953でfalseが返されます。どういうわけか、アイテムはまだ編集状態にあり、もう一度編集しようとしているようです。

bool QAbstractItemViewPrivate::shouldEdit(QAbstractItemView::EditTrigger trigger,
                                          const QModelIndex &index) const
{
// ..
    if (state == QAbstractItemView::EditingState)
      return false;
}

IIRCセルごとに複数の行があるテーブルでも同様の問題が発生しました。クラスQAbstractItemDelegateビューにアイテムデリゲートがあり、使用するエディターとその動作を制御できることを確認してください。デフォルトではQLineEditが使用されていると思います。QLineEditのようなエディターは、データの検証方法を制御するバリデーターを持つことができます。この場合、数値が0未満の場合は拒否します。ただし、モデル/ビュークラスを使用して、そのための独自のモデルを実装する必要があると思います。のQtドキュメントは次のようにQTreeWidget::setItemWidget(..)述べています。

この関数は、ツリーウィジェットアイテムの代わりに静的コンテンツを表示するためにのみ使用する必要があります。カスタム動的コンテンツを表示したり、カスタムエディターウィジェットを実装したりする場合は、代わりにQTreeViewandサブクラスを使用してください。QItemDelegate

ただし、ウィジェットクラスを使用してこれを行う簡単な方法があるかどうかはわかりません。

于 2012-08-29T07:22:51.323 に答える
5

問題は、非常に奇妙な方法でアイテムのフラグを設定していることである可能性があります。アイテムの選択と編集の両方を有効にするだけです。

item->setFlags(Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
于 2012-08-27T23:46:37.533 に答える
3

信号を受信したときに後続の列を編集しようとしたときに、同様の問題が発生しましたitemChanged。アイテムがまだ編集状態にあるというNilsの分析に基づいて、シグナル接続タイプをQueuedConnectionに変更しました。これにより、アイテムは再び入る前に状態を離れることができました。

于 2014-03-06T10:28:01.580 に答える
0

ショートカットキーを介してedit()を呼び出すと、「編集:編集に失敗しました」というエラーが発生するという同様の問題がありました。currentIndex()をedit()に渡していましたが、選択した行の正しい列が現在のものであるかどうかを確認していませんでした。編集できるのは最初の列だけだったので、その行をクリックしてから(他の列で)編集キーを呼び出すと、エラーが発生しました。

代わりにsibling(currentIndex()。row()、0)の結果をedit()に渡すことで、問題を解決することができました。

于 2017-06-16T22:06:13.260 に答える