-1

フォームからデータを入力しようとしました " QlineEdit からの整数を意味します "

プログラムは正常にコンパイルされますが、フォームとデータ全体を開くと、プログラムがクラッシュします

彼女はエラーです

Object::connect: No such slot FenArticle::chercheParFamille() in ..\stockmanagement\fenarticle.cpp:113
QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' is still in use, all queries will cease to work.
QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.

彼女の私のコード *

    #include "fenajoutearticle.h"
#include <QIntValidator>
#include <QValidator>

FenAjouteArticle::FenAjouteArticle(QWidget *parent) :
    QWidget(parent)
{
    resize(500,450);
    setWindowModality(Qt::ApplicationModal);

    // init member widgets

     //*****************************Signals SLots ******************************//
     signalSlots();

     //***********************************Base de donnée Traitement***********************************//

     db = new QSqlDatabase;
     *db = QSqlDatabase::addDatabase("QSQLITE") ;
     db->setHostName("localhost");
     db->setDatabaseName("gestionstockDB.db");
     db->setPassword("");
     db->setUserName("");

     db->open();

     if(!db->open())
         QMessageBox::critical(this,"Erreur","Erreur connexion base de données") ;
     else{
         QSqlQuery *chercheParFamilleQuery = new QSqlQuery("select Famille from Produit");
         SelectFamille->clear();
         while(chercheParFamilleQuery->next())
             SelectFamille->addItem(chercheParFamilleQuery->value(0).toString());

         QSqlQuery *chercheParUniteQuery = new QSqlQuery("select Unite from Produit");
         selectUnit->clear();
         while(chercheParUniteQuery->next())
             selectUnit->addItem(chercheParUniteQuery->value(0).toString());
     }
     // basic layouting 
}

void FenAjouteArticle::signalSlots()
{
    connect(buttonOkUtilisateur,SIGNAL(clicked()),this,SLOT(ajoutDonne())) ;
    connect(buttonAnnulerUtilisateur,SIGNAL(clicked()),this,SLOT(close())) ;
}

//********************* Signal Slots coeurs ***********************************//

void FenAjouteArticle::ajoutDonne()
{
    if(db->open())
    {


    QSqlQuery *ajouterDonneeQuery = new QSqlQuery;

        ajouterDonneeQuery->prepare("insert into Produit (Reference,Designation,localisation,Famille,Qte_min,Qte_max,Qte_stock,Unite,Prix_achat,Prix_vente)   VALUES(:ref,:design,:local,:fam,:qtmin,:qtmax,:qtstock ,:unite,:pachat,:pvente)");
        //QString Stock = champStockInit->text();


        ajouterDonneeQuery->bindValue(":ref",champRef->text());  // QlineEdit
        ajouterDonneeQuery->bindValue(":design",champDesignation->text()); // QlineEdit
        ajouterDonneeQuery->bindValue(":local",champLocalisation->text()); // QlineEdit
        ajouterDonneeQuery->bindValue(":fam","fam"); // QcomboBox
        ajouterDonneeQuery->bindValue(":qtmin",200); // QlineEdit
        ajouterDonneeQuery->bindValue(":qtmax",20); // QlineEdit
        ajouterDonneeQuery->bindValue(":qtstock",20); // QlineEdit
        ajouterDonneeQuery->bindValue(":unite","unite"); // QlineEdit
        ajouterDonneeQuery->bindValue(":pachat",20);  // QlineEdit
        ajouterDonneeQuery->bindValue(":pvente",champPrixVente->text());  // QlineEdit

        ajouterDonneeQuery->exec();

}

}
4

1 に答える 1

0

重複を伴うDBメッセージは、そのクラスの複数のインスタンスが原因です(私は推測します)。

main()メインウィンドウクラスなどの「グローバル」スポットでデータベース接続をセットアップします。(ただし、複数の接続が必要な場合を除きますが、sqliteを使用する場合はこれが良いとは思いません)複数の​​接続を使用する場合は、それらをQSqlQueryコンストラクターに追加する必要があります。そうしないと、デフォルトの接続、ほとんどが最初に作成された接続が使用されます。

名前が付けられたスロットが存在しFenArticle::chercheParFamille()ないことは、十分なメッセージであるべきです。一部の文字が正しくないか、指定されたパラメーターが宣言と異なる可能性があります。

値のバインディングに対して、sqlite は整数の値として文字列を使用してクールである必要があり、値が有効な整数である場合はそれを正しく使用します。代わりに次を使用できます。

QString intText = lineEdit->text();
bool test = false;
intText.toInt(&test);
if (test == true)
   // it is a valid integer, use it
else
   // message or whatever
于 2013-08-15T09:52:25.270 に答える