Qt使用中に発生した問題と解決策

5955 ワード

1.QSqlDatabasePrivate::removeDatabase:connection'myConnection'is still in use,all queries will cease to workの問題を解決する
この問題は、以前のデータベース接続が閉じられず、新しいデータベース接続を作成する必要があるためです.ソリューション:接続に関するすべてのクエリーを解放する必要があります.すなわち、接続に関連するすべてのqueryを削除します.同時に、接続を解放する場合は、接続の接続名を取得してから、現在のデータベースを閉じ、現在のデータベースをデフォルトのコンストラクション関数で上書きしてから、現在の接続を削除する必要があります.解決コード:void database::close()
{
QString connection;
connection = m_db.connectionName();
m_db.close();
m_db = QSqlDatabase();
m_db.removeDatabase(connection);
}
参照リンク:http://stackoverflow.com/questions/9519736/warning-remove-database http://stackoverflow.com/questions/8461333/sql-connection-still-open-even-after-deleting-it
2.Attempting to add QLayout""to Qdialog",which already has a layoutの問題を解決する
この問題は主にQDIalogオブジェクトを複数のレイアウトの間に同時に追加したためであり,解決策はサブレイアウトの作成時にデフォルトのコンポーネントを設定しないことである.つまり、レイアウトを作成するときにデフォルトのコンストラクション関数を使用し、部品を設定しないでください.解決コード:
    QDialog* dlg = new QDialog(this);
    //   
    serverLineEdit = new QLineEdit(dlg);
    //      
    QLabel* serverLabel = new QLabel(dlg);

    //  
    QPushButton *okBtn = new QPushButton(dlg);
    QPushButton *cancelBtn = new QPushButton(dlg);


    okBtn->setText(QString("  "));
    cancelBtn->setText(QString("  "));
    serverLabel->setText(QString("server:"));

    //server   
    QHBoxLayout* ServerHLayout = new QHBoxLayout;//      !!!
    serverLabel->setFixedWidth(80);
    serverLineEdit->setFixedWidth(200);
    serverLineEdit->setText("127.0.0.1");
    ServerHLayout->addWidget(serverLabel);
    ServerHLayout->addWidget(serverLineEdit);

    QHBoxLayout* btnHLayoutBtn = new QHBoxLayout;//      !!!
    btnHLayoutBtn->insertWidget(1,okBtn,0,Qt::AlignHCenter);
    btnHLayoutBtn->insertWidget(2,cancelBtn,0,Qt::AlignHCenter);

    QVBoxLayout *VLayout = new QVBoxLayout;//      !!!
    VLayout->addLayout(ServerHLayout);
    VLayout->addLayout(btnHLayoutBtn);
    VLayout->setSpacing(20);

    QGridLayout* globLayout = new QGridLayout(dlg);//        ,    
    globLayout->addLayout(VLayout,2,10);

    dlg->setLayout(globLayout);

    connect(okBtn,SIGNAL(clicked()),this,SLOT(getDBLoginInfo()));
    connect(okBtn,SIGNAL(clicked()),dlg,SLOT(close()));
    connect(cancelBtn,SIGNAL(clicked()),dlg,SLOT(close()));

    dlg->setModal(true);    //     
    dlg->show();`

3.Qt SQL serverにあるテーブルが存在するかどうかを判断する方法
解決コード:
 selectSql ="select * from sys.tables where name='"+tableName+"'";
 query->exec(selectSql);

 if(query->next())
    cout<the table is exsist!"<Not exsist!"<

4.Qt SQLiteにあるテーブルが存在するかどうかを判断する方法
解決コード:
selectSql = QString("select count(*) from sqlite_master where type='table' and name='%1'").arg(tableName);
flag = query->exec(selectSql);