0

問題

プログラムの本質的に「モデル」部分から「ビュー」部分に TCanvas を動的に渡したいと考えています。私がこれを行うことを考えた方法は、起動時にビューで TCanvas を作成し、グラフがいっぱいになったらビュー TCanvas でこの TCanvas を更新することでした。テストベンチを作成して、動作するかどうかを確認しました。

動作するメソッドと壊れたメソッドを表示しました。

私は QT-ROOT を使用しています。TQtWidgetは、本質的に TCanvas に戻るカスタム ウィジェットです。

マイキャンバスの設定

void DataTestTab::setupCanvas(int cNCbc) //I pass "2" to this for now to generate the below loop twice
{
    for (int i=0; i<cNCbc; i++)
    {
        m_vectorCanvas.push_back(new TQtWidget(this));

        //m_vectorCanvas[i]->GetCanvas()->SetFillColor(i);
        QHBoxLayout *loH = new QHBoxLayout(this);

        loH->addWidget(m_vectorCanvas[i]);
        m_vectorLayout.push_back(loH);

        QGroupBox *gbCanvas = new QGroupBox(this);
        QString title = QString("CBC %1").arg(i);
        gbCanvas->setTitle(title);
        gbCanvas->setLayout(m_vectorLayout[i]);
        m_vectorGroupBox.push_back(gbCanvas);

        ui->loCbcBox->addWidget(m_vectorGroupBox[i]); //adding the panels to the main layout
    }
}

この作品

void DataTestTab::drawTest()
    {
        static Int_t HistoID = 1;
        qDebug() << "in Testing env ";
        std::vector<TH1D*> graphs;
        std::vector<TCanvas*> vCanvas;

        TString name("h1_");
        Bool_t build = false;


        for (int i = 0; i <m_vectorCanvas.size() ; i++)
        {
            TCanvas *cCanvas = new TCanvas(build);
            name += HistoID++;

            vCanvas.push_back(cCanvas);
            vCanvas.at(i)->cd();


            TH1D *h1 = new TH1D(name.Data(),name.Data(),10,0, 10);
            graphs.push_back(h1);
            graphs.at(i)->Fill(i);

            graphs.at(i)->Draw();
            //graphs.at(i)->DrawCopy();

            m_vectorCanvas.at(i)->GetCanvas()->SetFillColor(i+5);
            m_vectorCanvas.at(i)->cd();

            qDebug() << i;

            m_vectorCanvas.at(i)->GetCanvas()->SetCanvas(vCanvas.at(i));
            m_vectorCanvas.at(i)->Refresh();
        }
    }

対応する出力:

作業方法

グラフの順序が間違っていますが。

これは動作しません

このメソッドを別のクラスに転送し、シグナル/スロットを介して TCanvas を渡します。

 void DataTestWorker::doWork()
    {
        static Int_t HistoID = 1;
        qDebug() << "in Testing env ";
        std::vector<TH1D*> graphs;
        std::vector<TCanvas*> vCanvas;

        TString name("h1_");
        Bool_t build = false;

        for (int i = 0; i <2 ; i++)
        {
            TCanvas *cCanvas = new TCanvas(build);
            name += HistoID++;

            vCanvas.push_back(cCanvas);
            vCanvas.at(i)->cd();

            TH1D *h1 = new TH1D(name.Data(),name.Data(),10,0, 10);
            graphs.push_back(h1);
            graphs.at(i)->Fill(i);

            graphs.at(i)->Draw();

        }
        emit sendGraphData(vCanvas); //void sendGraphData(const std::vector<TCanvas*> &canvas);

グラフ データは次の場所に送信されます。

void DataTestTab::drawGraph(const std::vector<TCanvas*> &canvas)
{
    for (int i=0; i<m_vectorCanvas.size(); i++)
    {
        canvas.at(i)->cd();
        m_vectorCanvas.at(i)->cd();
        m_vectorCanvas.at(i)->GetCanvas()->SetCanvas(canvas.at(i));
        m_vectorCanvas.at(i)->Refresh();
        //m_vectorCanvas.at(i)->GetCanvas()->Update();

    }
}

これは、このメソッドの出力です。

試行 2

現時点で確認できる唯一のエラーは、SetupTab で次のように表示されることです。

QLayout: Attempting to add QLayout "" to GUI::DataTestTab "DataTestTab", which already has a layout
QLayout: Attempting to add QLayout "" to GUI::DataTestTab "DataTestTab", which already has a layout
4

1 に答える 1