Home www.visualprog.cz

 

(c) 2004 Pavel Pindora 

Email Kontakt.

 

Click on of the PayPal button to donate money to this Project

KDevelop, QT Designer, Database, MySQL,...

29.10.2004

Protože jsem potřeboval rychle spíchnout aplikaci pro správu databáze , volil jsem co nejrychlejší cestu a to pomocí Qt Designer . V aplikaci jsem potřeboval nějaký logovací prohlížeč (ListView ) , jedno ok tlačítko,LineEdit a timer, který v daných časových intervalech bude procházet tabulku a hledat záznamy pomocí  SQL, dle kriterii. 

Klíčová slova použitá v aplikaci : 

QTime::currentTime() Zjištění aktuálního času , get current time
QDate::currentDate() Zjištění aktuálního datumu , get current date
setText("...") Nastavení textu do LineEdit, set text in LineEdit. lineEditFrom->setText("...");
text(); Sejmutí textu z LineEdit , LineEdit get text. QString neco = lineEditFrom->text();
addColumn Vložení sloupce v ListView , add column to ListView
removeColumn Smazání sloupce v List View , delete column in ListView
QSqlDatabase::drivers() Pro výpis dostupných SQL pluginů 
drivers.grep(DB_ADRESS_DRIVER).empty() Vyhledání zda je požadovaný ovládač k dispozici
QSqlDatabase::addDatabase Napojení na databázi, connect to database
Database->open() Otevření databáze, open database
Database->exec("SQL") Provedení SQL QSqlQuery query = defaultDB->exec("SQL");
QSqlQuery Výsledek provedení  Database->exec
query.isActive() true or false QSqlQuery query Database->exec
query.next() Nastaví další řádek (i první) ve výsledku Database->exec, Set first row in result of  Db->exec
query.value(column)  get value from column
QTimer Timer a jeho rutina timerProc 
QFile open(IO_WriteOnly | IO_Append)), Write to file
QTextStream stream Write Stream to file
progressBar Progress Bar

Potřebné headr file.

#include <qfile.h>
#include <qtimer.h>
#include <qsqldatabase.h>
#include <qlistview.h>
#include <qprogressbar.h>

Nejdříve jsem tedy potřeboval vložit prvek ListView do dialogové aplikace , nato LineEdit, progressBar,...

 

Timer vyvolává rutinu BaseFromTimerSystem , kde se dle proměnné startSystem vykonávají části programu, nejdříve se získá aktuální čas (Time::currentTime()) a ten se nastaví  do vloženého prvku lineEdit (lineEditTime) . Pokud je startSystem==1, sejme se aktuální datum (QDate dateC = QDate::currentDate();) a uloží do SQLparam2. Smažou se sloupce v ListView (listView1->removeColumn(0)) a přidají nové (listView1->addColumn("Index");...). Poté se vyvolá LOG rutina Myservis->WriteLog , která do ListView vepíše informační řádek, insert info row to ListView. Zvýší se přepínač (startSystem=1)  , kde se volá obsluha databáze (Myservis->ConnectDB();) . Dále se vyčkává na uplynutí časového intervalu aby se vše opakovalo znovu , doba kdy se to vykoná je indikována v progress baru (progBar->setTotalSteps(180);progBar->setProgress(startSystem);

void mysqlservisWidgetBase::BaseFromTimerSystem()// volano z mysqlservisWidget.cpp  FromTimerProcStartSystem()
{
	mysqlservis *Myservis = new mysqlservis();
	QTime	time = QTime::currentTime();
	SQLTime.sprintf("%2d:%2d:%2d",time.hour(),time.minute(),time.second());
	lineEditTime->setText(SQLTime);
	if( startSystem==0 )
	{
		QDate	dateC = QDate::currentDate();
		int		day = dateC.day()	;
		int		mon = dateC.month()	;
		int		yer = dateC.year()	;
		SQLparam1.sprintf( "%d.%d.%d",day+1,mon,yer );
		lineEditFrom->setText(SQLparam1);
		SQLparam2.sprintf( "%d.%d.%d",day,mon,yer   );
		lineEditTo->setText(SQLparam2);
    		SQLparam1	= lineEditFrom->text();
	    	SQLparam2	= lineEditTo->text();
		indexCol	= 1;
		startSystem = 1;
		
		listViewServ	= listView1;
		progBar		= progressBar1;
		
		listView1->removeColumn(0);
		listView1->removeColumn(0);
		listView1->removeColumn(0);
		listView1->addColumn("Index");
		listView1->addColumn("Ident");
		listView1->addColumn("Message");
		Myservis->WriteLog(listView1,indexCol++,"ok","System started:Initialize item" );
	}
	else
		if( startSystem==1 )
		{
			startSystem=2;//
			Myservis->ConnectDB();
		}
		else
		{
			startSystem++;
			if( startSystem>180 )
				startSystem=0;
			progBar->setTotalSteps(180);// = 0;
			progBar->setProgress(startSystem);// = 0;
		}
}

Následuje listing Myservis->ConnectDB(), který se napojí na databázi (connect to MySQL database) . Nejdříve se vypíšou (listing all db drivers)  všechny dostupné databázové ovládače , které jsou umístěny v /usr/lib/qt3../plugins/ . Potom se testuje zda je k dispozici QMYSQL3 ovládač , pomocí drivers.grep, pokud ano, proběhne napojení na databázi (addDatabase), nastavíme (set)  parameters a otevřeme ji (database open). Zavoláme rutinu obsluhující SQL a databázi uzavřeme (close database) . 

	logfile.remove();
 	#define	DB_ADRESS_DRIVER	"QMYSQL3"
	QStringList	drivers = QSqlDatabase::drivers();
	QStringList::Iterator it = drivers.begin();
	QString		driverName = DB_ADRESS_DRIVER+QString(" ");
	WriteLog(listViewServ,indexCol++,"-------- ","---------");
	while(it!=drivers.end())
	{
		WriteLog(listViewServ,indexCol++,"Info","DriverList "+ QString(*it)) ;
		it++;
	}
	WriteLog( listViewServ,indexCol++,"-------- ","---------");
	
	if( drivers.grep(DB_ADRESS_DRIVER).empty())
		WriteLog(listViewServ, indexCol++,"Error ","Empty driver " + QString(DB_ADRESS_DRIVER)) ;
	else
	{
		WriteLog(listViewServ,indexCol++,"ok","Driver exist "+	QString(DB_ADRESS_DRIVER) );
	}
	defaultDB = QSqlDatabase::addDatabase( DB_ADRESS_DRIVER );
	if(!defaultDB)
	{
		WriteLog(listViewServ,indexCol++,"Error",driverName + defaultDB->lastError().text() );
	}
        	defaultDB->setDatabaseName	( "TABLE" 	);
        	defaultDB->setHostName	( "localhost" 	);
        	defaultDB->setUserName	( "hostlocal" 	);
        	defaultDB->setPassword	( "****" 		);
	//---------------------------------------------------------------------------
        	if ( defaultDB->open() ) 
	{
		WriteLog(listViewServ,indexCol++,"ok","System: connected to db" );
		//-------------------------------------------------
		SQL_Init();
		//-------------------------------------------------	
		defaultDB->close();
		defaultDB->removeDatabase( DB_ADRESS_DRIVER );
		WriteLog(listViewServ,indexCol++,"ok","System: close db" );
		//-------------------------------------------------	
	}
	else
	{
		WriteLog(listViewServ,indexCol++,"Error","open "+ driverName + defaultDB->lastError().text() );
	}

Obsluha SQL je zhruba popsána v následujícím listingu.

QString	SQLkmr.sprintf("SELECT * FROM DBK%u",LastKmr);
QSqlQuery query = defaultDB->exec(SQLkmr);
if( query.isActive()==true )
{
	WriteLog(listViewServ,indexCol++,"actQuery  ",SQLkmr)  ;
}

Pokud potřebujeme získat hodnoty z QSqlQuery query použijeme k tomu query.value(číslo sloupce). 

while( query.next() )
{
    strKom = query.value(3).toInt();
    strDat = query.value(1).toString();
    strDbf = query.value(4).toString();

}

Nakonec si ukážeme aktivaci timeru , obsluhující rutinu timerProc musíme vložit jako slot 

class mysqlservis : public KMainWindow
{
    Q_OBJECT
public:
    /**
     * Default Constructor
     */
    mysqlservis();
    /**
     * Default Destructor
     */
    virtual ~mysqlservis();
    void DB_Init();
    void SQL_Init();
    void ConnectDB();
    void DeleteRow(QSqlQuery query,int day, int mon, int year);
    void WriteLog(QListView *ListServ, int indexLog, QString string1, QString string2 );
    int GetLastKomora(int *day, int *mon, int *year);
	/*************************************/
	private slots:
	void	timerProc();
};

 

//----------------- My code ------------------------------
QTimer *t = new QTimer( this );
connect( t, SIGNAL(timeout()), SLOT(timerProc()) );
t->start( 1000, FALSE );
//--------------------------------------------------------

 

a zbývá listing logovací funkce WriteLog, ta nejenže zapisuje do ListView ale i ukládá na disk dle

QFile logfile("/home/host/Log/MySQLSrv.log");

void mysqlservis::WriteLog(	QListView *ListServ, 
							int indexLog, 
							QString string1, 
							QString string2 )
{
    /// @todo implement me
	static	int	jeErr = 0;
	QString	strIdx;
	QString	tab,tab1;
	tab = "\t\t";
	tab1= "\t";
	strIdx.setNum(indexLog);
	if(ListServ)
	{
		ListServ->setSorting(-1);
		itemServ = new QListViewItem(ListServ,strIdx,string1,string2);
		ListServ->insertItem ( itemServ ) ;//		
	}
	if( jeErr==0 )
		if(logfile.open(IO_WriteOnly | IO_Append))
		{
			QTextStream stream(&logfile);
			string2 = string2 + "\n";
			stream << SQLTime + tab1 + strIdx +tab1+ string1 +tab+ string2;
			logfile.close();
		}
		else
		{
			itemServ = new QListViewItem(ListServ,strIdx,"ErrFile","Write to file");
			ListServ->insertItem ( itemServ ) ;//		
			jeErr=1;
		}
	
}