Seite 1 von 1

QSqlQueryModel in Gui verschieben

Verfasst: 22. September 2014 13:39
von Jannilein
Hallo,
ich würde gerne wissen wie ich mein QSqlQueryModel bzw dessen Ergebnisse in meinem Gui- Fenster verschieben kann.
Momentan ist es ganz oben in dem Fenster, gerne würde ich aber einen Button darüber machen ( ohne das etwas verdeckt wird ) mit dem man dann die Liste updaten kann, sobalt man drauf drückt. In einem QVBoxLayout kann man ja leider keine ganze view einfügen und ich weiß nicht wie ich da sonst alleine das model einfüge.
Momentan sieht die Methode so aus:

Code: Alles auswählen

{	 this->setGeometry(500,500,400,350);
 	 database = QSqlDatabase::addDatabase("QMYSQL", "conn1");
 	 database.setHostName("127.0.0.1");
 	 database.setPort(3306);
 	 database.setDatabaseName( "mydb" );
 	 database.setUserName("root");
 	 database.setPassword("Schatzi261213");
 	 returnvalue  = database.open();
 	 cout<<returnvalue<<endl;
	 QSqlQueryModel *model = new QSqlQueryModel;

	 if(database.isOpen()== true)
	  {
		 	model->setQuery("SELECT id, Nachname, Vorname, Ort FROM testtable", database);
		 	model->setHeaderData(1, Qt::Horizontal, tr("Salary"));
	  }
	 QTableView *view = new QTableView;
	 QPushButton* btnaddtotable = new QPushButton( "Load",view);
	 btnaddtotable->setGeometry(70,20,300,40);
	view->setModel(model);
	view->setGeometry(500,500,400,400);
	view->show();
}

Re: QSqlQueryModel in Gui verschieben

Verfasst: 22. September 2014 14:01
von MichaelS
n einem QVBoxLayout kann man ja leider keine ganze view einfügen und ich weiß nicht wie ich da sonst alleine das model einfüge.
Du kannst jedes beliebige von QWidget abgeleitete Objekt zu einem QVBoxLayout hinzufügen - also auch ein QTableView-Objekt.

Warum erstellst Du den Dialog nicht mit den Qt-Designer? Es ist einfacher, macht Deinen Code übersichtlicher und er sorgt auch dafür, dass Deine GUI-Elemente einen Parent zugewiesen bekommen (und vermeidet somit Memoy-Leaks).

Einen weiteren Hinweis noch:

Code: Alles auswählen

 database = QSqlDatabase::addDatabase("QMYSQL", "conn1");
Da Du wahrscheinlich ohnehin nur eine Datenbankverbindung verwendest, kannst Du den Verbindungsnamen auch weglassen:

Code: Alles auswählen

 database = QSqlDatabase::addDatabase("QMYSQL");
Qt erzeugt dann eine Standard-Datenbankverbindung, auf die sich dann künftig alle SQL-Statements beziehen, so dass Du nicht jedesmal das QSqlDatabase-Objekt mitgeben musst:

Code: Alles auswählen

setQuery("SELECT id, Nachname, Vorname, Ort FROM testtable");

Re: QSqlQueryModel in Gui verschieben

Verfasst: 23. September 2014 08:36
von Jannilein
Danke,
magst du mir villeicht helfen ?
Mein Gui- Fenster schließt sich immer, sobald ich auf einen der Buttons klicke.

Code: Alles auswählen

void Tester::UpdateButtonClicked()
{
	if(database.isOpen()== true)
	{
		model->setQuery("UPDATE id, Nachname, Vorname, Ort SET testtable");
	}
	view->setModel(model);
}
void Tester::InsertButtonClicked()
{
	if(database.isOpen()== true)
	{
		model->setQuery("INSERT INTO testtable (Nachname, Vorname, Ort) VALUES ('Lala', 'LuLu', 'Dudu')");
	}
	view->setModel(model);
}

Code: Alles auswählen

void Tester::init()
{	QSqlQueryModel *model = new QSqlQueryModel;
	view = new QTableView;
	QPushButton* btnUpdate = new QPushButton( "UPDATE",view);
	QPushButton* btnInsert = new QPushButton( "INSERT",view);
	QVBoxLayout *layout = new QVBoxLayout;
	this->setGeometry(500,500,400,350);
	btnUpdate->setGeometry(70,20,300,40);
	btnInsert->setGeometry(70,20,300,40);
	view->setModel(model);

	database = QSqlDatabase::addDatabase("QMYSQL");
	database.setHostName("127.0.0.1");
	database.setPort(3306);
	database.setDatabaseName( "mydb" );
	database.setUserName("root");
	database.setPassword("Schatzi261213");
	returnvalue  = database.open();
	cout<<returnvalue<<endl;

	if(database.isOpen()== true)
	{
		model->setQuery("SELECT id, Nachname, Vorname, Ort FROM testtable");
	}
	model->setHeaderData(0, Qt::Horizontal, tr("ID"));
	model->setHeaderData(1, Qt::Horizontal, tr("Nachnamme"));
	model->setHeaderData(2, Qt::Horizontal, tr("Vorname"));
	model->setHeaderData(3, Qt::Horizontal, tr("Ort"));
	model->setParent(this);

	layout->addWidget(btnUpdate);
	layout->addWidget(btnInsert);
	layout->addWidget(view);
	this->setLayout(layout);
	view->setGeometry(500,500,400,400);

	QObject::connect ( btnUpdate, SIGNAL ( clicked() ), this , SLOT(UpdateButtonClicked())) ;
	QObject::connect ( btnInsert, SIGNAL ( clicked() ), this , SLOT(InsertButtonClicked())) ;
	
	view->show();

Re: QSqlQueryModel in Gui verschieben

Verfasst: 23. September 2014 12:29
von MichaelS
Wenn ein Programm abstürzt, ist der Debugger das Tool der Wahl. Da der Dich direkt an die Absturzstelle bringt, erleichtert das die Suche nach dem Fehler ungemein.