Application en langage C réalisation d’un mini chat
Application en langage C réalisation d’un mini chat
Cet article propose en détaille une application en langage C réalisation d’un mini chat, Programmer par C++, bibliothèque Qt architecture client/serveur.
Les sockets sont échangés entre les clients et le serveur par le protocole réseau Tcp.
Cette application présente un exemple pour les programmeurs qui débutent dans Qt et qui veulent comprendre le fonctionnement des applications Client/Serveur.
Vous pourrez télécharger le fichier au format zip il contient le code sources complet.
Extrait du code source :
** Meta object code from reading C++ file 'dialog.h'
**
** Created: Thu May 13 06:04:53 2010
** by: The Qt Meta Object Compiler version 62 (Qt 4.6.2)
**
** WARNING! All changes made in this file will be lost!
#include "dialog.h"
#if !defined(Q_MOC_OUTPUT_REVISION)
#error "The header file 'dialog.h' doesn't include <QObject>."
#elif Q_MOC_OUTPUT_REVISION != 62
#error "This file was generated using the moc from 4.6.2. It"
#error "cannot be used with the include files from this version of Qt."
#error "(The moc has changed too much.)"
#endif
QT_BEGIN_MOC_NAMESPACE
static const uint qt_meta_data_Dialog[] = {
// content:
4, // revision
0, // classname
0, 0, // classinfo
2, 14, // methods
0, 0, // properties
0, 0, // enums/sets
0, 0, // constructors
0, // flags
0, // signalCount
// slots: signature, parameters, type, tag, flags
8, 7, 7, 7, 0x08,
49, 7, 7, 7, 0x08,
0 // eod
};
static const char qt_meta_stringdata_Dialog[] = {
"Dialog\0\0on_comboBox_currentIndexChanged(QString)\0"
"on_buttonBox_accepted()\0"
};
const QMetaObject Dialog::staticMetaObject = {
{ &QDialog::staticMetaObject, qt_meta_stringdata_Dialog,
qt_meta_data_Dialog, 0 }
};
#ifdef Q_NO_DATA_RELOCATION
const QMetaObject &Dialog::getStaticMetaObject() { return staticMetaObject; }
#endif //Q_NO_DATA_RELOCATION
const QMetaObject *Dialog::metaObject() const
{
return QObject::d_ptr->metaObject ? QObject::d_ptr->metaObject : &staticMetaObject;
}
void *Dialog::qt_metacast(const char *_clname)
{
if (!_clname) return 0;
if (!strcmp(_clname, qt_meta_stringdata_Dialog))
return static_cast<void*>(const_cast< Dialog*>(this));
return QDialog::qt_metacast(_clname);
}
int Dialog::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
{
_id = QDialog::qt_metacall(_c, _id, _a);
if (_id < 0)
return _id;
if (_c == QMetaObject::InvokeMetaMethod) {
switch (_id) {
case 0: on_comboBox_currentIndexChanged((*reinterpret_cast< QString(*)>(_a[1]))); break;
case 1: on_buttonBox_accepted(); break;
default: ;
}
_id -= 2;
}
return _id;
}
QT_END_MOC_NAMESPACE
... ... ... ...
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
db = QSqlDatabase::addDatabase( "QSQLITE" );
db.setDatabaseName("biblio.sqlite" );
if( !db.open() )
QMessageBox::information(0, tr("Button"),tr("Failed to open database"));
QStringList choixVuePretSL;
choixVuePretSL << "Prêt en cours" << "Tous les prêts";
ui->comboBox->addItems(choixVuePretSL);
init();
ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
ui->tableWidget_2->setSelectionBehavior(QAbstractItemView::SelectRows);
connect(ui->tableWidget,SIGNAL(itemClicked ( QTableWidgetItem *)),SLOT(menu_ctx_h(QTableWidgetItem *)));
connect(ui->tableWidget_2,SIGNAL(itemClicked ( QTableWidgetItem *)),SLOT(menu_prets(QTableWidgetItem *)));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::changeEvent(QEvent *e)
{
QMainWindow::changeEvent(e);
switch (e->type()) {
case QEvent::LanguageChange:
ui->retranslateUi(this);
break;
default:
break;
}
}
void MainWindow::on_pushButton_4_clicked()
{
ui->tabWidget->setCurrentIndex(1);
}
void MainWindow::on_pushButton_3_clicked()
{
ui->tabWidget->setCurrentIndex(0);
}
void MainWindow::on_tabWidget_currentChanged(int index)
{
ui->lineEdit_10->clear();
ui->tableWidget->clear();
init();
}
void MainWindow::on_pushButton_clicked()
{
if ((ui->lineEdit->text()!="")&&(ui->lineEdit_2->text()!=""))
{
db = QSqlDatabase::addDatabase( "QSQLITE" );
db.setDatabaseName("biblio.sqlite" );
if( !db.open() )
QMessageBox::information(0, tr("Button"),tr("Failed to open database"));
QSqlQuery qry;
QString sql="INSERT INTO livres (nom,auteur) VALUES (?,?)";
//INSERT INTO table_name (column1, column2, column3,...)
//VALUES (value1, value2, value3,...)
qry.prepare(sql);
qry.addBindValue(ui->lineEdit->text());
qry.addBindValue(ui->lineEdit_2->text());
//QString val="val:"+dat+"/"+nom;
if( !qry.exec() ) QMessageBox::information(0, tr("Button"),tr("Failed to insert"));
{
QMessageBox::information(0, tr("Button"),tr("Nouvelle entrée dans la base de données"));
ui->lineEdit->setText("");
ui->lineEdit_2->setText("");
}
//else QMessageBox::information(0, tr("Button"),val);
//db.close();
}
}
void MainWindow::init(void) {
// menucontext * mc1=new menucontext();
// ui->tableWidget->setHorizontalHeader(mc1) ;
/*
this->connect( mc1, SIGNAL( signal_menu_ctx( int, const QPoint &) ),
SLOT( menu_ctx_h( int, const QPoint & ) ) ) ;
*/
//itemClicked (mc1, QTableWidgetItem * item )
QStringList labelH;
labelH << "Id" << "Nom du livre" << "Auteur" << "Disponible";
ui->tableWidget->setColumnWidth(0,30);
ui->tableWidget->setColumnWidth(1,280);
ui->tableWidget->setColumnWidth(2,200);
ui->tableWidget->setColumnWidth(3,80);
ui->tableWidget->setHorizontalHeaderLabels(labelH);
int row=0;
/*
db = QSqlDatabase::addDatabase( "QSQLITE" );
db.setDatabaseName("biblio.sqlite" );
if( !db.open() )
QMessageBox::information(0, tr("Button"),tr("Failed to open database"));
*/
QSqlQuery qry;
QString sql="SELECT id,nom,auteur,dispo FROM livres";
qry.prepare(sql);
QString nom;
QStringList nomSL,auteurSL,idSL,dispoSL;
if( !qry.exec() ) QMessageBox::information(0, tr("Button"),tr("Failed to select"));
else {
while( qry.next() )
{
idSL << qry.value(0).toString();
nomSL << qry.value(1).toString();
auteurSL << qry.value(2).toString();
if (qry.value(3).toString()=="")
dispoSL << "Oui";
else dispoSL << qry.value(3).toString();
row++;
}
ui->tableWidget->setRowCount(row);
for(int i=0;i<row;i++)
{
QTableWidgetItem *idTWI=new QTableWidgetItem(idSL.at(i));
ui->tableWidget->setItem(i,0,idTWI);
QTableWidgetItem *nomTWI=new QTableWidgetItem(nomSL.at(i));
ui->tableWidget->setItem(i,1,nomTWI);
QTableWidgetItem *auteurTWI=new QTableWidgetItem(auteurSL.at(i));
ui->tableWidget->setItem(i,2,auteurTWI);
QTableWidgetItem *dispoTWI=new QTableWidgetItem(dispoSL.at(i));
ui->tableWidget->setItem(i,3,dispoTWI);
}
}
init_pretsEnCours();
}
// a mettre à jour
void MainWindow::on_pushButton_5_clicked()
{
/*
db = QSqlDatabase::addDatabase( "QSQLITE" );
db.setDatabaseName("biblio.sqlite" );
if( !db.open() )
QMessageBox::information(0, tr("Button"),tr("Failed to open database"));
*/
QStringList labelH;
labelH << "Id" << "Nom du livre" << "Auteur" << "Disponible";
ui->tableWidget->setColumnWidth(0,30);
ui->tableWidget->setColumnWidth(1,280);
ui->tableWidget->setColumnWidth(2,200);
ui->tableWidget->setColumnWidth(3,80);
ui->tableWidget->setHorizontalHeaderLabels(labelH);
int row=0;
QSqlQuery qry;
QString sql="SELECT id,nom,auteur,dispo FROM livres WHERE nom LIKE ?";
qry.prepare(sql);
qry.addBindValue(ui->lineEdit_10->text()+"%");
QString nom;
QStringList nomSL,auteurSL,idSL,dispoSL;
if( !qry.exec() ) QMessageBox::information(0, tr("Button"),tr("Failed to select"));
else {
while( qry.next() )
{
idSL << qry.value(0).toString();
nomSL << qry.value(1).toString();
auteurSL << qry.value(2).toString();
if (qry.value(3).toString()=="")
dispoSL << "Oui";
else dispoSL << qry.value(3).toString();
row++;
}
ui->tableWidget->setRowCount(row);
for(int i=0;i<row;i++)
{
QTableWidgetItem *idTWI=new QTableWidgetItem(idSL.at(i));
ui->tableWidget->setItem(i,0,idTWI);
QTableWidgetItem *nomTWI=new QTableWidgetItem(nomSL.at(i));
ui->tableWidget->setItem(i,1,nomTWI);
QTableWidgetItem *auteurTWI=new QTableWidgetItem(auteurSL.at(i));
ui->tableWidget->setItem(i,2,auteurTWI);
QTableWidgetItem *dispoTWI=new QTableWidgetItem(dispoSL.at(i));
ui->tableWidget->setItem(i,3,dispoTWI);
}
}
}