0

私が欲しいのは、テキストボックスにIDを入力してEnterキーを押すと、IDが存在する場合、そのIDがテーブルに表示され、このウィンドウから別のウィンドウにマップを使用してテーブルの値が挿入されることです。 Box1はマップとして開かれます。私の考えでは、マップのfindコマンドを実行し、テキストボックスに入力された値が存在する場合はifループを使用すると、ダミーデータが表示されるのと同じように表示されます。使用したコード

Box1::Box1(QWidget *parent)
        :QDialog(parent)
    {
    searchgroup = new QGroupBox(tr("Data Search"));

    QHBoxLayout *layout2 = new QHBoxLayout;
    text = new QLineEdit(this);
    searchh = new QLabel(tr("&Enter ID:"));
    searchh->setBuddy(text);
    layout2->addWidget(searchh);
    layout2->addWidget(text);
    searchgroup->setLayout(layout2);
    tableegroup = new QGroupBox(tr("Searched Data"));
    QVBoxLayout *layout1 = new QVBoxLayout;
    tablee = new QTableView(this);
    mode1 = new QStandardItemModel(1,2,this);
    mode1->setHorizontalHeaderItem(0, new QStandardItem(QString("ID")));
    mode1->setHorizontalHeaderItem(1, new QStandardItem(QString("DATA")));
    map<int,QString>::iterator itt;
    itt=dataa.begin();
            for (int colu = 0; colu < 2; colu++)
            {
                    item1 = new QStandardItem();

                    if (colu == 0)
                    {
                            item1->setData(((*itt).first), Qt::DisplayRole);
                            mode1->setItem(0,0,item1);
                    } else
                    {
                            item1->setData(((*itt).second), Qt::DisplayRole);
                            mode1->setItem(0,1,item1);
                    }
            }

    tablee->setModel(mode1);
    layout1->addWidget(tablee);
    tableegroup->setLayout(layout1);

    QVBoxLayout *mainlayout1 = new QVBoxLayout;
    //mainlayout1->addWidget(menubarr);
    mainlayout1->addWidget(searchgroup);
    mainlayout1->addWidget(tableegroup);
    setLayout(mainlayout1);
}

事前に助けてくれてありがとう 私が欲しいものを編集する

void Box1::textReturn()
{
        bool ok;
        int id = text->text().toInt(&ok);
//      map<int,QString>::iterator itt;
        if (ok && dataa.contains(id))
        {

        //      add row (id, data[id] to table
        }
        else
        {
                QMessageBox msgbox = new QMessagebox();
                msgbox->setWindowTitle("Alert");
                msgbox->setText("No such ID present!");
                msgbox->show();
        }
}

EDIT2

void Box1::textReturn()
{
        int id = (text->text()).toInt();
        map<int,QString>::iterator itt;
        itt = dataa.find(id);
        if(itt != dataa.end())           //returns 1 if we found something
        {
                QList<QStandardItem *> items;
                items << new QStandardItem(QString("%1").arg(id));
                items << new QStandardItem((*itt).second);
                mode1->appendRow(items);
                tablee->update();
        }
        else
        {
                QMessageBox *msgbox = new QMessageBox();
                msgbox->setWindowTitle("Alert");
                msgbox->setText("INVALID  ID  ENTERED");
                msgbox->show();
        }
}
4

2 に答える 2

0

私があなたの質問を理解する限り。Box1クラスに新しいスロットを作成する必要があります。それをtextReturnPressed()と呼びましょう。returnPressed()次に、それをからの信号に接続する必要がありますtext

connect(text, SIGNAL(returnPressed()), this, SLOT(textReturnPressed());

そしてここにtextReturnPressedがあります(私はそれがコンパイルされることを願っています)

void textReturnPressed()
{
     bool ok;
     int id = text->text().toInt(&ok);
     if (ok && dataa.count(id) > 0) {
         QList<QStandardItem *> items;
         items << new QStandardItem(QString("%1").arg(id));
         items << new QStandardItem(dataa[id]);
         mode1.appendRow(items);
     }
}

アイテムがマップにあるかどうかを確認するためにイテレータは必要ありません。関数を呼び出すだけmap.count()です。

于 2012-07-06T13:50:36.360 に答える
0

@KCiebieraが言ったように、あなたはこの接続をしなければなりません

connect(text, SIGNAL(returnPressed()), this, SLOT(textReturnPressed());

次に、を使用してテーブル内のキーを見つける必要があります

QList<QStandardItem *> QStandardItemModel::findItems ( const QString & text, 
                     Qt::MatchFlags flags = Qt::MatchExactly, int column = 0 )

マップがあるので、要素が繰り返されないように、QListはNULLであるか、要素が1つだけ含まれている必要があります。要素を(QStandardItemとして)取得するときは、呼び出す必要があります

tablee->showColumn ( int column )
tablee->showRow ( int row )

列はQStandarItem->column()および行QStandardItem-> row();になります。

編集

void Box1::textReturnPressed()
{
     int id = (test->text()).toInt();
     map<int, string>::iterator it;
     it = dataa.find(id);
     if(it != dataa.end())           //we found something
     {
         QList<QStandardItem *> items;
         items << new QStandardItem(QString("%1").arg(id));
         items << new QStandardItem((*it).second);
         mode1->appendRow(items);
     }
     else
         QMessageBox::information(this, "Info", "ID not found!", QMessageBox::ok);
}

このようなもの;

于 2012-07-06T14:09:34.170 に答える