Seite 1 von 1

QTableWidget und SQL => sortier Problem

Verfasst: 30. Oktober 2009 17:24
von bjoernt
Hallo,

ich habe ein QTableWidget und das wird per SQL gefüllt.
Meine Idee war, das sortieren zu erlauben und in Abhängigkeit von der Spalte und Sortierrichtung das SQL ebenfalls dynamisch zu sortieren,
Mein Problem ist jedoch das die eigentliche Spalte sortiert ist aber der "Rest" der Spalten durcheinander ist. Jedenfalls lässt sich da keine Sortierung erkennen :

Hier ein bisschen Code.

Habe ich einen Denkfehler ?

Definition :

Code: Alles auswählen

  tableheader.append(tr("Datum"));
  tableheader.append(tr("Typ"));
  tableheader.append(tr("Benutzer"));
  tableheader.append(tr("Auftrag Nr"));
  tableheader.append(tr("Änderungscontext"));

  tableWidgetRMSLog->setColumnCount(5);
  tableWidgetRMSLog->setRowCount(1);
  tableWidgetRMSLog->setHorizontalHeaderLabels(tableheader);
  tableWidgetRMSLog->setSortingEnabled(true);
  tableWidgetRMSLog->horizontalHeader()->setSortIndicator(0, Qt::DescendingOrder);
Befüllen :

Code: Alles auswählen


 tableWidgetRMSLog->clearContents();

...

    if (tableWidgetRMSLog->isSortingEnabled())  {
      //1.Colum
      if (tableWidgetRMSLog->horizontalHeader()->sortIndicatorSection() <= 0) {
        if (tableWidgetRMSLog->horizontalHeader()->sortIndicatorOrder() == Qt::AscendingOrder) {
          orderStmt = "ORDER BY timestamp ASC";
        } else {
          orderStmt = "ORDER BY timestamp DESC";
        };
      };


    } else {
      orderStmt = "ORDER BY timestamp DESC";
    };

SQL wird dann gebaut mit entsprechendem order by (ist korrekt) und anschließend die Items gefüllt und angezeigt:

Code: Alles auswählen


  if (query.size() > 0) {
      tableWidgetRMSLog->setRowCount(query.size());

      int r=0;
      while (query.next()) {
        QColor bgcolor = Qt::white;
        if (query.value(2).toString() == "warning") {
          bgcolor = Qt::yellow;
        } else if (query.value(2).toString() == "error") {
          bgcolor = Qt::gray;
        } else if (query.value(2).toString() == "critical") {
          bgcolor = Qt::red;
        };
          
          
        QDateTime date = QDateTime::fromTime_t(query.value(0).toInt());
        QTableWidgetItem *timestamp = new QTableWidgetItem(date.toString("dd.MM.yyyy hh:mm:ss"));
        timestamp->setFlags(Qt::ItemIsSelectable);
        timestamp->setTextAlignment(Qt::AlignLeft | Qt::AlignTop);
        timestamp->setBackgroundColor(bgcolor);
        timestamp->setTextColor(Qt::black);

        QTableWidgetItem *item = new QTableWidgetItem(query.value(1).toString());
        item->setFlags(Qt::ItemIsSelectable);
        item->setTextAlignment(Qt::AlignLeft | Qt::AlignTop);
        item->setBackgroundColor(bgcolor);
        item->setTextColor(Qt::black);

        QTableWidgetItem *changer = new QTableWidgetItem(query.value(3).toString());
        changer->setFlags(Qt::ItemIsSelectable);
        changer->setTextAlignment(Qt::AlignLeft | Qt::AlignTop);
        changer->setBackgroundColor(bgcolor);
        changer->setTextColor(Qt::black);

        QString tID = query.value(4).toString();
        if (tID == "0")
          tID = tr("N/A");
        QTableWidgetItem *taskid = new QTableWidgetItem(tID);
        taskid->setFlags(Qt::ItemIsSelectable);
        taskid->setTextAlignment(Qt::AlignLeft | Qt::AlignTop);
        taskid->setBackgroundColor(bgcolor);
        taskid->setTextColor(Qt::black);
        
      
        QByteArray contextB64 = QByteArray::fromBase64(query.value(5).toByteArray());
        
        QTableWidgetItem *context = new QTableWidgetItem( QString(contextB64) );
        QString myToolTip = QString(contextB64) + toolTipHelp;
        context->setToolTip(myToolTip);
        context->setFlags(Qt::ItemIsSelectable);
        context->setTextAlignment(Qt::AlignLeft | Qt::AlignTop);
        context->setBackgroundColor(bgcolor);
        context->setTextColor(Qt::black);

        tableWidgetRMSLog->setItem(r, 0, timestamp);
        tableWidgetRMSLog->setItem(r, 1, item);
        tableWidgetRMSLog->setItem(r, 2, changer);
        tableWidgetRMSLog->setItem(r, 3, taskid);
        tableWidgetRMSLog->setItem(r, 4, context);
        r++;
      };
  } else {
     unwichtig
  };
  
  /*
   * resize columns automatically.
   * Rows are resized by double click.
   */
  tableWidgetRMSLog->resizeColumnsToContents();