であり、最も広く使用されている一つの列のQTreeWidgetItem編集可能
-
25-09-2019 - |
質問
してい QTreeWidgetItem
二列のデータ、本当にありがとう限を持っていないために編集可能?い場合は、以下の:
QTreeWidgetItem* item = new QTreeWidgetItem();
item->setFlags(item->flags() | Qt::ItemIsEditable);
全てのカラムを編集できるようになります。
解決
QTreeWidget
とQTreeWidgetItem
を使用して断念し、QTreeView
とQAbstractItemModel
で行く必要がありますようには見えます。 「ウィジェット」のクラスは、より抽象的なが、より柔軟なバージョンの具体的な実装である便利なクラスです。 QAbstractItemModel
はあなたの列に適切な値を返すコールflags(QModelIndex index)
を持っています。
他のヒント
あなたは回避策を使用してQTreeWidgetの編集可能で特定の列のみを行うことができます:
1)NoEditTriggersにQTreeWidgetのeditTriggersプロパティを設定
Qtの設定挿入項目に2):QTreeWidgetItemオブジェクトのItemIsEditableフラグ
3)を接続QTreeWidget対象の信号を「itemDoubleClicked」に次のスロット
void MainWindow::onTreeWidgetItemDoubleClicked(QTreeWidgetItem * item, int column)
{
if (isEditable(column)) {
ui.treeWidget->editItem(item, column);
}
}
「isEditableを」はあなたが非編集可能な列のための編集可能な列と偽のための本当のリターンを書いた関数である。 この
私は最近、同じ問題を抱えていたし、すべてのEditTriggersで動作するソリューションを発見しただけでなく、1(ダブルクリックされた信号への接続)をダブルクリックさ
エディタのNULLポインタを返すデリゲートを作成します:
class NoEditDelegate: public QStyledItemDelegate {
public:
NoEditDelegate(QObject* parent=0): QStyledItemDelegate(parent) {}
virtual QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const {
return 0;
}
};
そして後で列
のカスタムデリゲートとしてそれを使用しますui->parameterView->setItemDelegateForColumn(0, new NoEditDelegate(this));
のように標準QTreeWidgetすることを認めていません。私には二つの方法が用意されていないこ
使用QTreeView自分のクラスからQAbstractItemModel、オーバーライドのフラグ機能
使用QTreeViewとQStandardItemModel.そのときに追加の項目をセットするだけで、実際に適切なカラムを編集:
こちらは一部のコードのオプション:
QString x, y;
QList<QStandardItem*> newIt;
QStandardItem * item = new QStandardItem(x);
item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsDragEnabled);
newIt.append(item);
item = new QStandardItem(y);
item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsDragEnabled | Qt::ItemIsEditable);
newIt.append(item);
model->appendRow(newIt);
私の第二のアプローチより簡単なものに依存するなどの柔軟性だと思います。
私が見つけた最も簡単な方法は、Qtの:: ItemFlagsを使用していた。
void myClass::treeDoubleClickSlot(QTreeWidgetItem *item, int column)
{
Qt::ItemFlags tmp = item->flags();
if (isEditable(item, column)) {
item->setFlags(tmp | Qt::ItemIsEditable);
} else if (tmp & Qt::ItemIsEditable) {
item->setFlags(tmp ^ Qt::ItemIsEditable);
}
}
それはif
である場合は、 OR
の上部がAND
介して編集機能を追加し、そして底チェック、次いでXOR
でそれを削除します。
この方法では、編集機能は、あなたがそれをしたい時に追加し、そうでない時に削除されます。
次に、ツリーウィジェットのitemDoubleClicked()
信号にこの機能を接続して、あなたの「編集するかを編集するには」isEditable()
class EditorDelegate : public QItemDelegate
{
Q_OBJECT
public:
EditorDelegate(QObject *parent):QItemDelegate(parent){};
QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
};
QWidget* EditorDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
if(index.column() == 1)
{
return QItemDelegate::createEditor(parent, option, index);
}
return nullptr;
}
QTreeWidget
で
myQTreeWidget::myQTreeWidget()
{
EditorDelegate *d = new EditorDelegate(this);
this->setItemDelegate(d);
}
たぶん少し遅れて、しかし助けることがあります。
void MyClass::on_treeWidget_itemDoubleClicked(QTreeWidgetItem *item, int column) {
Qt::ItemFlags flags = item->flags();
if(column == 0)
{
item->setFlags(flags & (~Qt::ItemIsEditable));
}
else
{
item->setFlags(flags | Qt::ItemIsEditable);
}
}
0ここであなたが読み取り専用にしたい列のインデックスです。
flags & (~Qt::ItemIsEditable)
あなたの項目に関係なく、前回のフラグを0にItemIsEditable位置を設定します。
flags | Qt::ItemIsEditable
は関係なく、以前のフラグを1に設定します。
私は、一般的にPySideとPythonに新たなんだけど、私はitemClickedコールバックにQTreeWidgetに登録することにより、仕事にこれを取得することができました。コールバックの中で、列をチェックし、それはあなたが編集できるようにしたい列のためだ場合のみ、「editItem」と呼びます。
class Foo(QtGui.QMainWindow):
...
def itemClicked(self, item, column):
if column > 0:
self.qtree.editItem(item, column)
列0 editItemを起動しないことによって、イベントは基本的に廃棄されます。
私は作品だけでなくための私のニーズ以下のコードとは「ちょっと」止めるないことが判明しました カラムの特定の部分を編集することからユーザー:
私は基本的役割とその列をチェックします。私は、他の列のユーザー編集それは、その後、私はのsetData編集を停止し、変更が行われていないされている場合、列0そうで編集することができます。
void treeItemSubclassed::setData(int column, int role, const QVariant &value) {
if (role == Qt::ItemIsEditable && column != 0){
return;
}
QTreeWidgetItem::setData(column, role, value);
}
セットの子ツリーウィジェット行と列に基づいて編集可能かどうか(木の回)。