Frage

ich eine QTreeWidgetItem mit zwei Spalten von Daten hat, ist es eine Möglichkeit, nur die zweite Spalte bearbeitbar zu machen? Wenn ich die folgenden:

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

Alle Spalten werden editierbar.

War es hilfreich?

Lösung

Sieht aus wie Sie verzichten müssen mit QTreeWidget und QTreeWidgetItem und gehen mit QTreeView und QAbstractItemModel. Die „Widget“ Klassen sind Convenience-Klassen, die konkreten Implementierungen der abstraktere aber flexiblerer Versionen sind. QAbstractItemModel hat einen Anruf flags(QModelIndex index), wo Sie den entsprechenden Wert für Ihre Spalte zurückkehren würde.

Andere Tipps

Sie können nur bestimmte Spalten in einer QTreeWidget editierbar mit einer Abhilfe machen:

1) Stellen Sie die editTriggers Eigenschaft des QTreeWidget zu NoEditTriggers

2) Auf Einfügen von Elementen, setzen die Qt: ItemIsEditable Flagge des QTreeWidgetItem Objekt

3) Verbinden der folgenden Schlitz zu dem "itemDoubleClicked" Signal des QTreeWidget Objekts:

void MainWindow::onTreeWidgetItemDoubleClicked(QTreeWidgetItem * item, int column)
{
    if (isEditable(column)) {
        ui.treeWidget->editItem(item, column);
    }
}

, wobei „isEditable“ ist eine Funktion, die Sie, dass die Renditen gilt für editierbare Spalten und false für nicht editierbare Spalten geschrieben.

Ich hatte das gleiche Problem vor kurzem und entdecken eine Lösung, die mit allen EditTriggers arbeitet, nicht nur die DoubleClicked eines (und die Verbindung mit dem Doppelklickten Signal)

Erstellen Sie einen Delegierten, dass die Rendite ein NULL-Pointer für den Editor:

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;
      }
    };

Und später verwenden Sie es als benutzerdefinierten Delegat für Ihre Spalte

ui->parameterView->setItemDelegateForColumn(0, new NoEditDelegate(this));

Scheinen, wie der Standard QTreeWidget dies nicht zulässt. Ich denke, es gibt zwei Möglichkeiten, dies zu tun:

  1. Verwenden Sie einen QTreeView mit Ihrer eigenen Klasse von QAbstractItemModel abgeleitet und überschreiben die Flags funktionieren

  2. Verwenden Sie ein QTreeView mit einem QStandardItemModel. Dann, wenn Sie das Element fügen Sie einfach die entsprechenden Spalt Bearbeitungen zulassen:

Hier ist ein Code für die zweite Option:

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);

finde ich den zweiten Ansatz einfacher, aber das hängt davon ab, wie viel Flexibilität, die Sie mit Ihrem Modell wollen.

Die einfachste Art und Weise, dass ich gefunden Qt :: ItemFlags verwenden

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);
    }
}

Die Oberseite des if fügt die Bearbeitungsfunktionen durch eine OR, und die unteren überprüft, ob sie mit AND da ist, dann entfernt sie mit einem XOR.

Auf diese Weise die Bearbeitung Funktionalität hinzugefügt wird, wenn Sie es wollen, und entfernt, wenn Sie dies nicht tun.

Schließen Sie dann diese Funktion, um den itemDoubleClicked() Signal Baum-Widget, und schreiben Sie Ihre 'zu bearbeiten oder nicht zu bearbeiten Entscheidung innerhalb von 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;
}

Im QTreeWidget:

myQTreeWidget::myQTreeWidget()
{
    EditorDelegate *d = new EditorDelegate(this);
    this->setItemDelegate(d);
}

Vielleicht ein wenig spät, aber helfen kann:

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);
    } 
}

Hier 0 ist der Index der Spalte, die Sie nur lesbar machen wollen.

flags & (~Qt::ItemIsEditable)

Setzt die ItemIsEditable Position auf 0 unabhängig von der vorherigen Flagge Ihres Artikels.

flags | Qt::ItemIsEditable

Setzt es auf 1 unabhängig von der vorherige Flagge.

Ich bin neu in pyside und Python im Allgemeinen, aber ich war in der Lage, dies zu Arbeit zu erhalten, indem mit dem QTreeWidget für itemClicked Rückrufe Registrierung. Im Callback, überprüfen Sie die Spalte und nur nennen editItem ', wenn es für eine Spalte ist wollen, damit Sie bearbeiten.

class Foo(QtGui.QMainWindow):
...
def itemClicked(self, item, column):
   if column > 0:
      self.qtree.editItem(item, column)

Mit dem nicht editItem für Spalte 0 Aufruf, wird das Ereignis im Grunde verworfen.

fand ich heraus, dass der folgende Code funktioniert gut für meine Bedürfnisse und nicht „irgendwie“ des Stopp Benutzer von der Bearbeitung bestimmte Teile der Spalten:

Ich prüfe grundsätzlich für Rolle und dann Spalte. Ich erlaube nur für die Bearbeitung in der Spalte 0, so dass, wenn der Benutzer bearbeitet es in jeder anderen Spalte, dann habe ich die setData bearbeiten stoppen und keine Änderung vorgenommen wird.

void treeItemSubclassed::setData(int column, int role, const QVariant &value) {
    if (role == Qt::ItemIsEditable && column != 0){
        return;
    }
    QTreeWidgetItem::setData(column, role, value);
}

Stellen Sie das Kind von der Baum-Widget editierbar oder nicht (Zeiten Baum), bezogen auf die Zeile und Spalte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top