2

QPushButton を QTableView に追加しようとしているプロジェクトに取り組んでいます。また、そのボタンを接続して、データベースからドキュメントを開きたいです。これまでのところ、ボタンを追加し、そのための接続ステートメントを作成しましたが、ボタンをクリックしても何も起こりませんでした。

ここに私のコードがあります

void MainWindow::DocumentTable()
{
tableview = new QTableView;
query = new QSqlQueryModel(this);
signalMapper = new QSignalMapper(this);

foreach(it,treeWidget->selectedItems())
{
    for (int col=0; col< it->columnCount(); ++col)
    {
        qDebug() << col << it->text(col);

QSqlQuery qry;
qry.prepare("select * from document where Folno=:Folno");
qry.bindValue(":Folno", it->text(col));
qry.exec();


query->setQuery(qry);
tableview->setModel(query);
tableview->setEditTriggers(QAbstractItemView::NoEditTriggers);

for (int i = 0; i< 1000; i++)
{
    button= new QPushButton("Open Document");
    tableview->setIndexWidget(tableview->model()->index(i, 0), button);
    signalMapper->setMapping(button, i);
}

connect(signalMapper, SIGNAL(mapped(int)), this, SLOT(imageFROMdatabase()));

tableview->show();

Docwidget= new QDockWidget(this);
Docwidget->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);

Docwidget->setWidget(tableview);
addDockWidget(Qt::RightDockWidgetArea,Docwidget);

Docwidget->show();

if(!query->submit())
  {
     QMessageBox::warning(0,"Error",query->lastError().text());

  }

 db.close();

}

         }
          }

これがスロット関数です

   void MainWindow::imageFROMdatabase()
 {


QSqlQuery imageQuery;

imageQuery.prepare("SELECT * from doc_page where doc_no=:doc_no and f_number=:f_number");
imageQuery.bindValue(":doc_no", 1);
imageQuery.bindValue(":f_number",1);
imageQuery.exec();
imageQuery.next();

if( imageQuery.lastError().isValid())
    {
    QMessageBox::warning(0,"Error",imageQuery.lastError().text());

  //  QSqlDatabase::database().rollback();
     }
else
{
   // QByteArray ba1 = imageQuery.value(1).toByteArray();
    QPixmap pic;
    pic.loadFromData( ba);

scrollArea = new QScrollArea;
scrollArea->setBackgroundRole(QPalette::Dark);
scrollArea->setEnabled(true);

QString fileName = QFileDialog::getOpenFileName(this,"Open Image File",QDir::currentPath());
QImage image(fileName);

scene = new QGraphicsScene();
view = new QGraphicsView(scene);
item = new QGraphicsPixmapItem(QPixmap::fromImage(image));
scene->addItem(item);

     xwidget= new QDockWidget(this);
     xwidget->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);

     xwidget->setWidget(view);
     addDockWidget(Qt::RightDockWidgetArea,xwidget);
     xwidget->show();

     db.close();
     }
 }

これらのコードに何か問題があるかどうか教えてください。

4

1 に答える 1

0

スロット方式は信号方式と同じではありません。それらは完全に等しい署名を持っている必要があります。qDebug()は、いくつかの警告を生成するはずです。出力を注意深く読んでください。imageFROMDatabase()メソッドは、入力として整数も受け入れる必要があります。信号は実際の関数ではありません。それらは、それらと署名が一致する別の関数をトリガーするために使用されます。

connect(signalMapper, SIGNAL(mapped(int)), this, SLOT(imageFROMdatabase()));

このように変更します:

connect(signalMapper, SIGNAL(mapped(int)), this, SLOT(imageFROMdatabase(int)));

ansも:

void MainWindow::imageFROMdatabase( int x ) { ... }

また、信号とスロットがスレッドにない場合は、手動列挙型Qt::ConnectionTypeをお読みください

于 2012-09-10T22:12:58.273 に答える