Seite 1 von 1

[gelöst]: Ergebnis dynamischer Query in Tabelle anzeigen

Verfasst: 7. August 2005 12:38
von gosar
Hallo,
bin (immer noch) QT Anfänger.
Habe eine Frage:
Wie kann ich die Ergebnisse einer dynamischen QSqlQuery (wechselnde Ergebnismengen) in einem QTableWidget darstellen?
Soweit ich gelesen habe muss ja jedem QTableWidget-Feld ein QTableWidgetItem-Object zugewiesen werden.
Und da haperts bei mir.
Wenn ich dem QTableWidget schon Rowcount und Colcount vorgebe, existieren ja schon Zellen. Sind diese automatisch mit einem "leeren" QTableWidgetItem gefüllt, wessen Wert ich einfach neu setzen kann?
Wenn nicht, wie lege ich vorab (oder in einem Rutsch) dynamisch die Items (in einer Schleife) an und weise die sofort zu?
Ich habe schon versucht die in einem Vector-Array abzulegen, aber habe nur Fehlermeldungen geerntet.

Gibts da nen einfachen Weg?

Danke,
Gosar

Verfasst: 7. August 2005 23:36
von FlorianBecker

Verfasst: 9. August 2005 14:25
von gosar
Danke erstmal.
Ich bin dem mal nachgegangen und komme irgendwie noch nicht ganz zum Ziel.

Das mit QTableView konstruierte Fenster klappt kurz auf und ist sofort wieder verschwunden. Geht so schnell, man sieht es kaum.

Hier einmal mein komplettes Grundgerüst:

main.cpp

Code: Alles auswählen

#include <QApplication>
#include "QMeinHauptFenster.h"

int main(int argc, char *argv[])
{
  QApplication app(argc, argv);
  QMeinHauptFenster *window = new QMeinHauptFenster;
  window->show();
  return app.exec();
}
---

QMeinHauptFenster.h

Code: Alles auswählen

#include "ui_meineui.h"

class QMeinHauptFenster : public QMainWindow, private Ui::HauptFenster
{
  Q_OBJECT

  public:
                QMeinHauptFenster(QWidget *parent = 0);
                QString myQuery;  

  public slots:
                void queryAusfuehren();
};
---

QMeinHauptFenster.cpp

Code: Alles auswählen


#include "QMeinHauptFenster.h"
#include <QTextEdit>
#include <QMessageBox>
#include <QtSql>
#include <QtGui/QtGui>
#include <QTableWidgetItem>
#include <QTableWidget>
#include <vector>
QMeinHauptFenster::QMeinHauptFenster(QWidget *parent) : QMainWindow(parent)
{
  setupUi(this);
  myQuery = "";
  memoQueryText->setPlainText("SELECT * FROM test");
//  SgQueryErgebnis->setRowCount(10);
//  SgQueryErgebnis->setColumnCount(15);	
  QObject::connect(pushButton, SIGNAL(clicked()), this, SLOT(queryAusfuehren()));
  	
};

void QMeinHauptFenster::queryAusfuehren()
{
  myQuery= memoQueryText->toPlainText();
  QSqlDatabase defaultDB = QSqlDatabase::addDatabase("QSQLITE");
  defaultDB.setDatabaseName("mydb.db");
  if ( defaultDB.open() )
  {
    QMessageBox::about(this, "Query",myQuery);
	  
    QSqlQuery target;
    QSqlQuery query( myQuery, defaultDB );
	  
    QSqlQueryModel model;
    model.setQuery("select * from test");
    QTableView view;
    view.setModel(&model);
    view.show();
  }

}

Nicht wundern, die Includes kommen teilweise noch von früheren vergeblichen Versuchen. ;-)

ui_meineui.h

Code: Alles auswählen

#ifndef UI_MEINEUI_H
#define UI_MEINEUI_H

#include <QtCore/QVariant>
#include <QtGui/QAction>
#include <QtGui/QApplication>
#include <QtGui/QButtonGroup>
#include <QtGui/QLineEdit>
#include <QtGui/QMainWindow>
#include <QtGui/QPushButton>
#include <QtGui/QTableWidget>
#include <QtGui/QTextEdit>
#include <QtGui/QWidget>

class Ui_HauptFenster
{
public:
    QWidget *centralWidget;
    QPushButton *pushButton;
    QLineEdit *lineEdit;
    QTableWidget *SgQueryErgebnis;
    QTextEdit *memoQueryText;

    void setupUi(QMainWindow *HauptFenster)
    {
    HauptFenster->setObjectName(QString::fromUtf8("HauptFenster"));
    HauptFenster->resize(QSize(735, 472).expandedTo(HauptFenster->minimumSizeHint()));
    centralWidget = new QWidget(HauptFenster);
    centralWidget->setObjectName(QString::fromUtf8("centralWidget"));
    pushButton = new QPushButton(centralWidget);
    pushButton->setObjectName(QString::fromUtf8("pushButton"));
    pushButton->setGeometry(QRect(300, 170, 101, 31));
    lineEdit = new QLineEdit(centralWidget);
    lineEdit->setObjectName(QString::fromUtf8("lineEdit"));
    lineEdit->setGeometry(QRect(40, 180, 171, 20));
    SgQueryErgebnis = new QTableWidget(centralWidget);
    SgQueryErgebnis->setObjectName(QString::fromUtf8("SgQueryErgebnis"));
    SgQueryErgebnis->setGeometry(QRect(40, 220, 651, 221));
    memoQueryText = new QTextEdit(centralWidget);
    memoQueryText->setObjectName(QString::fromUtf8("memoQueryText"));
    memoQueryText->setGeometry(QRect(43, 30, 651, 121));
    HauptFenster->setCentralWidget(centralWidget);
    retranslateUi(HauptFenster);

    QMetaObject::connectSlotsByName(HauptFenster);
    } // setupUi

    void retranslateUi(QMainWindow *HauptFenster)
    {
    HauptFenster->setWindowTitle(QApplication::translate("HauptFenster", "MainWindow"));
    pushButton->setText(QApplication::translate("HauptFenster", "PushButton"));
    memoQueryText->setHtml(QApplication::translate("HauptFenster", "<html><head><meta name=\"qrichtext\" content=\"1\" /></head><body style=\" white-space: pre-wrap; font-family:Sans Serif; font-weight:400; font-style:normal; text-decoration:none;\"><p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">TEST</p></body></html>"));
    Q_UNUSED(HauptFenster);
    } // retranslateUi

};

namespace Ui {
    class HauptFenster: public Ui_HauptFenster {};
} // namespace Ui

#endif // UI_MEINEUI_H

Wie binde ich das TableView-Object in mein Formular ein?
Und wie erreiche ich, dass es etwas länger angezeigt wird ?

Ein Anzeigen der Datensätze in ein QTableWidget ist also nicht so ohne weiteres möglich?

Gruß, gosar.

Verfasst: 11. August 2005 09:18
von FlorianBecker
Also du hast zwei Möglichkeiten, entweder über den ModelView, oder händisch in der Tabelle.

Es ist beides problemlos Möglich:
1. SqlTableModel, es steht ein Beispiel in der Dokumentation:

Code: Alles auswählen

QSqlTableModel *model = new QSqlTableModel;
model->setTable("employee");
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
model->select();
model->removeColumn(0); // don't show the ID
model->setHeaderData(0, Qt::Horizontal, QObject::tr("Name"));
model->setHeaderData(1, Qt::Horizontal, QObject::tr("Salary"));

QTableView *view = new QTableView;
view->setModel(model);
view->show();
2. QTableWidget:
Diese Möglichkeit ist beinahe genauso, nur das du die Queries selber ausführen musst.

Code: Alles auswählen

while ( QUERY ) {

  table -> blahblah
}
Ich sehe dein Problem noch nicht wirklich. Vielleicht versuchst du es mit kompakteren Beschreibungen, die dein Problem auf den Punkt bringen.

Verfasst: 15. August 2005 20:28
von gosar
Danke.
Die TableView-Variante klappt bestens.
Nur ein QTableWidget zu füllen will nicht so recht funktionieren.
Aber da komme ich auch noch hinter.

Vielen Dank für Deine Hilfe.