Editieren eines QTableWidgetItem deaktivieren



  • Hiho Community,

    Ich versuche gerade das Editieren eines Items von nem QTableWidget zu deaktivieren. Nach einem Sekündchen googeln wurde mir bewusst, dass man dazu die entsprechenden Flags setzen muss. Aber irgendwie funktionert die Methode QTableWidgetItem::flags() nicht wie sie sollte (im Sinne von Segmentation Fault). Ich hab das mit item->setFlags(Qt::ItemFlag(item->flags() ^ ~Qt::ItemIsEditable)); lösen wollen, aber ich scheine es nicht richtig zu machen. Alle Codeschnipsel die ich mithilfe von Google gefunden haben, haben den gleichen Fehler erzeugt.

    Hier ein Minimalbeispiel, das bei mir den Segfault erzeugt:

    #include <QtWidgets/QApplication>
    #include <QtWidgets/QWidget>
    #include <QTableWidget>
    
    int main(int argc, char** argv){
        QApplication app(argc, argv);
    
        QWidget window;
        window.resize(500, 300);
    
        QTableWidget* table = new QTableWidget(1, 1, &window);
        QTableWidgetItem* item = table->item(0, 0);
    
        item->setFlags(Qt::ItemFlags(item->flags() ^ ~Qt::ItemIsEditable)); // SIGSEGV
        window.show();
    
        return app.exec();
    }
    

    Wenn ich das Ganze mit dem Debugger durchgehe sagt er, dass das Segfault in der Methode QTableWidgetItem::flags() (qtablewidget.h) kommt, und dies sieht so aus:

    inline Qt::ItemFlags flags() const { return itemFlags; }
    

    ...und ich kann mir den Fehler einfach nicht erklären. Eine andere Möglichkeit das Item zu deaktivieren habe ich nicht gefunden (kein setEnabled()/Disabled() vorhanden).

    Ein kleines bisschen Hilfe würde ich sehr schätzen 🙂
    Grüße.



  • table->item wird dir halt 0 zurückgeben, weil die Tabelle leer ist. Du musst items hinzufügen, bevor du drauf zugreifen kannst.



  • Soso.

    Ich dachte die würden automatisch erstellt werden, sobald ich die Dimensionen der Tabelle angeben würde. ein table->setItem(0, 0, new QTableWidgetItem); hat das Problem nun gelöst.

    Danke für die Hilfe.
    Grüße.


  • Mod

    In diesem Fall würde ich von setItemPrototype gebrauch machen,
    das TableItem kannst du auch unabhängig vom TableWidget erstellen, und dann als Prototype setzen.



  • phlox81 schrieb:

    In diesem Fall würde ich von setItemPrototype gebrauch machen,
    das TableItem kannst du auch unabhängig vom TableWidget erstellen, und dann als Prototype setzen.

    Jo, klingt fein.
    Dankeschön.


Log in to reply