Loa archivos .tar pueden abrirse con Winrar sin problemas, pero mejor te dejo el code asi lo armas directamente:
sql.h#ifndef SQL_H
#define SQL_H
#include <QtSql>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QMessageBox>
#include <QListWidget>
#include <QTreeWidget>
#include <QtGui>
class QTreeWidgetItem;
class cMySql
{
public:
cMySql(){cItem=0;};
bool createConeccion(const QString sServer, const QString sBD, const QString sUser, const QString sPassword);
void closeConeccion();
void listBD(QListWidget *listQuery);
void listTables(QListWidget *listQuery, const QString sBD);
void listRows(QTreeWidget *qtWidget, QTreeWidgetItem *qtrItem, const QString sBD, const QString sTable, QIcon iconItem);
void editResults(const QString sBD, const QString sTable, const QString s1erColumn, const QString sColumn, QString sId, const QString sNewValue);
void MessageBox(const QString sTitle, const QString sMessage);
private:
QSqlDatabase db;
QTreeWidgetItem *cItem;
};
#endif // SQL_H
sql.cpp#include "sql.h"
bool cMySql::createConeccion(const QString sServer, const QString sBD, const QString sUser, const QString sPassword)
{
db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName(sServer);
db.setDatabaseName(sBD);
db.setUserName(sUser);
db.setPassword(sPassword);
db.setPort(3306);
if (!db.open()) {
MessageBox("Error al acceder a la Base de Datos",db.lastError().text());
return false;
}
return true;
}
void cMySql::listBD(QListWidget *listQuery)
{
listQuery->clear();
QSqlQuery query;
query.exec("show databases");
while (query.next()) {
listQuery->addItem(query.value(0).toString());
qApp->processEvents(QEventLoop::AllEvents);
}
}
void cMySql::listTables(QListWidget *listQuery, const QString sBD)
{
listQuery->clear();
QSqlQuery query;
query.exec("use " + sBD);
query.exec("SHOW TABLES");
while (query.next()) {
listQuery->addItem(query.value(0).toString());
qApp->processEvents(QEventLoop::AllEvents);
}
}
void cMySql::listRows(QTreeWidget *qtWidget, QTreeWidgetItem *qtrItem, const QString sBD, const QString sTable, QIcon iconItem)
{
qtWidget->clear();
for(int i=0;i<qtrItem->columnCount();i++)
{
qtrItem->setText(i, QApplication::translate("window", (const char *) "", 0, QApplication::UnicodeUTF8));
}
int i =0;
QSqlQuery query;
QSqlQuery query1;
query.exec("use " + sBD);
query.exec("DESCRIBE " + sTable);
while (query.next()) {
qtrItem->setIcon(i, iconItem);
qtrItem->setText(i, QApplication::translate("window", (const char *) query.value(0).toString().toLatin1().data(), 0, QApplication::UnicodeUTF8));
i++;
qApp->processEvents(QEventLoop::AllEvents);
}
qtWidget->setColumnCount(7);
query1.exec("SELECT * FROM " + sTable);
while (query1.next()) {
cItem = new QTreeWidgetItem(qtWidget);
for(int j=0; j<i;j++)
{
const QString setData = query1.value(j).toString();
cItem->setText(j,(const char *)setData.toLatin1().data());
qApp->processEvents(QEventLoop::AllEvents);
}
qApp->processEvents(QEventLoop::AllEvents);
}
}
void cMySql::editResults(QString sBD, QString sTable, QString s1erColumn, QString sColumn, QString sId, QString sNewValue)
{
QSqlQuery query;
query.exec("use " + sBD);
if(query.exec("UPDATE " + sTable + " SET " + sColumn + "='" + sNewValue + "' WHERE " + s1erColumn + "=" + sId))
MessageBox("Edicion Correcta","Se actualizo el valor: " + sNewValue);
else MessageBox("error",query.lastError().text());
}
void cMySql::closeConeccion()
{
if(db.isOpen())db.close();
}
void cMySql::MessageBox(const QString sTitle, const QString sMessage)
{
QMessageBox mBox;
mBox.setWindowTitle(sTitle);
mBox.setText(sTitle);
mBox.setInformativeText( sMessage);
mBox.setStandardButtons(QMessageBox::Ok);
mBox.setDefaultButton(QMessageBox::Ok);
mBox.setIcon(QMessageBox::Information);
mBox.exec();
}
window.h#ifndef WINDOW_H
#define WINDOW_H
#include <QDialog>
#include <QIcon>
#include "sql.h"
class QLineEdit;
class QLabel;
class QPushButton;
class QGroupBox;
class QListWidget;
class QTreeWidget;
class QTreeWidgetItem;
class QTreeWidgetItem;
class QStandardItemModel;
class dWindow: public QDialog
{
Q_OBJECT
public:
dWindow(QWidget *parent = 0);
~dWindow();
void createTreeResult(const QString &sColumn, const int iTotal);
void setDataTreeResult(QTreeWidget *qtWidget, const QString &sData, int iColumna);
protected:
void closeEvent(QCloseEvent *event);
private slots:
void vQueryClicked();
void vQuery(const QString sServer, const QString sBD, const QString sUser, const QString sPassword);
void on_listBD_itemClicked();
void on_listTables_itemClicked();
void on_treeResult_itemClicked();
private:
QLabel *labelUser;
QLabel *labelPassword;
QLabel *labelBD;
QLabel *labelServer;
QLabel *labelResBD;
QLabel *labelTables;
QLabel *labelRows;
QLineEdit *lineUser;
QLineEdit *linePassword;
QLineEdit *lineBD;
QLineEdit *lineServer;
QPushButton *butQuery;
QPushButton *butExit;
QGroupBox *groupBox;
QGroupBox *groupBox1;
QGroupBox *groupBox2;
QListWidget *listBD;
QListWidget *listTables;
QTreeWidget *treeResult;
QTreeWidgetItem *qtrItem;
QIcon icon;
QIcon iconItem;
QTreeWidgetItem *cItem;
QStandardItemModel *model;
cMySql mysql;
};
#endif // WINDOW_H
window.cppicon e
iconItem usan archivos de recursos (find.png, items.png) que puedes agregarlos en el proyecto con las imagenes que gustes.
#include <QtGui>
#include "window.h"
#define MAX_LENGHT 20
dWindow::dWindow(QWidget *parent)
:QDialog(parent)
{
QFont fuente;
fuente.setFamily(QString::fromUtf8("Modern No. 20"));
fuente.setPointSize(14);
fuente.setBold(true);
fuente.setItalic(true);
fuente.setWeight(60);
QFont fuente2;
fuente2.setFamily(QString::fromUtf8("MS Shell Dlg 2"));
fuente2.setPointSize(10);
fuente2.setBold(true);
fuente2.setWeight(50);
QDesktopWidget *d = QApplication::desktop();
int ancho = d->width();
int alto = d->height();
//Añadimos el icono del archivo de recursos
icon.addFile(QString::fromUtf8(":/icos/iconos/find.png"), QSize(), QIcon::Selected, QIcon::On);
iconItem.addFile(QString::fromUtf8(":/icos/iconos/items.png"), QSize(), QIcon::Selected, QIcon::On);
//GROUPBOX PARA LA CONEXION
groupBox = new QGroupBox(this);
groupBox->setObjectName(QString::fromUtf8("gbDatos"));
groupBox->setGeometry(QRect(10, 10, 780, 100)); //X,Y,ANCHO,ALTO
labelUser = new QLabel(tr("USUARIO"),groupBox);
labelUser->setGeometry(QRect(10, 20, 130, 25));
lineUser = new QLineEdit(groupBox);
lineUser->setGeometry(QRect(10, 50, 130, 20));
labelPassword = new QLabel(tr("PASSWORD"),groupBox);
labelPassword->setGeometry(QRect(145, 20, 130, 20));
linePassword = new QLineEdit(groupBox);
linePassword->setEchoMode(QLineEdit::Password);
linePassword->setGeometry(QRect(145, 50, 130, 20));
labelBD = new QLabel(tr("BASE DE DATOS"),groupBox);
labelBD->setGeometry(QRect(280, 20, 170, 25));
lineBD = new QLineEdit(groupBox);
lineBD->setGeometry(QRect(280, 50, 170, 20));
labelServer = new QLabel(tr("SERVIDOR"),groupBox);
labelServer->setGeometry(QRect(455, 20, 130, 25));
lineServer = new QLineEdit(groupBox);
lineServer->setGeometry(QRect(455, 50, 170, 20));
//buttons
butQuery = new QPushButton(tr("Iniciar consulta"),groupBox);
butQuery->setGeometry(QRect(630, 14, 145, 35));
butExit = new QPushButton(tr("Salir"),groupBox);
butExit->setGeometry(QRect(630, 58, 145, 35));
//GROUPBOX PARA LOS RESULTADOS
groupBox1 = new QGroupBox(this);
groupBox1->setObjectName(QString::fromUtf8("gbResultado"));
groupBox1->setGeometry(QRect(10, 115, 780, 105));
labelResBD = new QLabel(tr("Lista Bases de Datos"),groupBox1);
labelResBD->setGeometry(QRect(60, 20, 200, 25));
labelTables = new QLabel(tr("Lista Tablas de la Base de Datos"),groupBox1);
labelTables->setGeometry(QRect(450, 20, 300, 25));
listBD = new QListWidget(groupBox1);
listBD->setGeometry(QRect(10, 45, 370, 50));
listTables = new QListWidget(groupBox1);
listTables->setGeometry(QRect(395, 45, 370, 50));
//GROUPBOX PARA LOS RESULTADOS DE LOS DATOS
groupBox2 = new QGroupBox(this);
groupBox2->setObjectName(QString::fromUtf8("gbDatos"));
groupBox2->setGeometry(QRect(10, 230, 780, 350));
labelRows = new QLabel(tr("Lista datos encontrados en las tablas de la Base de Datos"),groupBox2);
labelRows->setGeometry(QRect(150, 20, 500, 25));
treeResult = new QTreeWidget(groupBox2);
qtrItem = new QTreeWidgetItem();
model = new QStandardItemModel(treeResult);
treeResult->setHeaderItem(qtrItem);
treeResult->setObjectName(QString::fromUtf8("treeResult"));
treeResult->setGeometry(QRect(10, 45, 760, 300));
treeResult->header()->setClickable(true);
QString iniciar = "";
createTreeResult(iniciar,7);
//INCLUYENDO LA FUENTE DE LETRA
groupBox->setFont(fuente);
groupBox1->setFont(fuente);
groupBox2->setFont(fuente);
listBD->setFont(fuente2);
listTables->setFont(fuente2);
treeResult->setFont(fuente2);
//Seteamos el maximo tamaño y numero de caracteres que puenden ingresar
lineUser->setMaxLength(MAX_LENGHT);
linePassword->setMaxLength(MAX_LENGHT);
lineBD->setMaxLength(MAX_LENGHT);
lineServer->setMaxLength(MAX_LENGHT);
connect(butQuery,SIGNAL(clicked()),this,SLOT(vQueryClicked()));
connect(butExit,SIGNAL(clicked()),this,SLOT(close()));
connect(listBD,SIGNAL(itemClicked(QListWidgetItem*)),this,SLOT(on_listBD_itemClicked()));
connect(listTables,SIGNAL(itemClicked(QListWidgetItem*)),this,SLOT(on_listTables_itemClicked()));
connect(treeResult,SIGNAL(clicked(QModelIndex)),this,SLOT(on_treeResult_itemClicked()));
groupBox->setTitle(QApplication::translate("Inicio", "REQUISITOS PARA INGRESAR A LA BASE DE DATOS", 0, QApplication::UnicodeUTF8));
groupBox1->setTitle(QApplication::translate("Inicio", "RESULTADOS DEL ESCANEO AL SERVIDOR DE BASE DE DATOS", 0, QApplication::UnicodeUTF8));
groupBox2->setTitle(QApplication::translate("Inicio", "RESULTADOS DE LA CONSULTA A LA TABLA EN LA BASE DE DATOS", 0, QApplication::UnicodeUTF8));
setWindowTitle(tr("MYSQL BROWSER BY 43H4FH44H45H4CH49H56H45H"));
Qt::WindowFlags f = Qt::Window ;
setWindowFlags(f);
setGeometry((ancho)-1100,(alto)-700,800,600);
setStyleSheet(QString::fromUtf8("background-color: rgb(255, 255, 255);"));
setMaximumSize(800,600);
setMinimumSize(800,600);
setWindowIcon(icon);
}
dWindow::~dWindow()
{
delete labelUser;
delete labelPassword;
delete labelBD;
delete labelServer;
delete labelResBD;
delete labelTables;
delete labelRows;
delete lineUser;
delete linePassword;
delete lineBD;
delete lineServer;
delete butQuery;
delete butExit;
delete groupBox;
delete groupBox1;
delete groupBox2;
delete listBD;
delete listTables;
delete treeResult;
delete qtrItem;
delete cItem;
delete model;
}
void dWindow::vQueryClicked()
{
listTables->clear();
listBD->clear();
treeResult->clear();
if(!lineServer->text().isEmpty() || !lineBD->text().isEmpty() || !lineUser->text().isEmpty()|| !linePassword->text().isEmpty())
{
vQuery(lineServer->text(),lineBD->text(),lineUser->text(),linePassword->text());
}
else mysql.MessageBox("Error en los Datos Ingresados", "Llene todos los datos antes de realizar la conexion");
}
void dWindow::vQuery(const QString sServer, const QString sBD, const QString sUser, const QString sPassword)
{
if(mysql.createConeccion(sServer,sBD,sUser,sPassword))
{
butQuery->setDisabled(true);
lineServer->setDisabled(true);
lineBD->setDisabled(true);
lineUser->setDisabled(true);
linePassword->setDisabled(true);
mysql.listBD(listBD);
}
}
void dWindow::on_listBD_itemClicked()
{
listBD->setDisabled(true);
listTables->setDisabled(true);
treeResult->setDisabled(true);
listTables->clear();
treeResult->clear();
QListWidgetItem *curitem = listBD->currentItem();
QString text = curitem->text();
mysql.listTables(listTables,text);
listBD->setEnabled(true);
listTables->setEnabled(true);
}
void dWindow::on_listTables_itemClicked()
{
listBD->setDisabled(true);
listTables->setDisabled(true);
treeResult->setDisabled(true);
treeResult->clear();
QListWidgetItem *curitem = listBD->currentItem();
QListWidgetItem *curitem2 = listTables->currentItem();
QString text = curitem->text();
listTables->setDisabled(true);
mysql.listRows(treeResult,qtrItem,text,curitem2->text(),iconItem);
listTables->setEnabled(true);
listBD->setEnabled(true);
treeResult->setEnabled(true);
}
void dWindow::on_treeResult_itemClicked()
{
bool ok;
QString edit = QInputDialog::getText(this, tr("¿Desea editar este valor?"),tr("Valor Actual: ") + treeResult->currentIndex().data(Qt::DisplayRole).toString(),QLineEdit::Normal,treeResult->currentIndex().data(2).toString(),&ok,Qt::Dialog);
if (ok)
{
treeResult->currentItem()->setData(treeResult->currentIndex().column(),Qt::EditRole,edit);
mysql.editResults(listBD->currentItem()->text(),
listTables->currentItem()->text(),
qtrItem->data(0,Qt::DisplayRole).toString(),
qtrItem->data(treeResult->currentIndex().column(),Qt::DisplayRole).toString(),
treeResult->currentItem()->data(0,Qt::DisplayRole).toString(),edit);
}
}
void dWindow::createTreeResult(const QString &sColumn, int iTotal)
{
for(int i=0;i<iTotal;i++)
{
qtrItem->setIcon(i, iconItem);
qtrItem->setText(i, QApplication::translate("window", (const char *) sColumn.toLatin1().data(), 0, QApplication::UnicodeUTF8));
}
}
void dWindow::closeEvent(QCloseEvent *event)
{
mysql.closeConeccion();
event->accept();
}
main.cpp#include <QtGui>
#include "window.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
dWindow *win = new dWindow;
win->show();
return app.exec();
}
Para compilar, el modo mas sencillo que encontre fue instalar el
QT SDK http://qt.nokia.com/downloads/ (LGPL), luego instalar MySQL Server 5.1 (mysql-essential-5.1.55-win32.msi) en la ruta que gustes.
Luego entrar a Qt Command Prompt (si es win vista o 7 como admin).
configure -release -qt-sql-mysql -l mysql -I D:/MySQL/include -L D:/MySQL/lib/opt -static
En mi caso lo tenia instalado en la unidad D con win XP en la ruta MySQL, luego:
mingw32-make
Con eso bastaria para crear el plugin mysql.
Aqui te dejo un ejemplo compilado para windows por si quieres verlo.
http://www.4shared.com/file/RNFigoAz/Mysql.htmlBueno puedes mejorar varias cosas, asi que ahi te lo dejo
Saludos.