C++ 如果我将向量传递给另一个类,为什么ROOT只允许我将TCanvas向量的最后一个元素设置为另一个TCanvas向量? 问题

C++ 如果我将向量传递给另一个类,为什么ROOT只允许我将TCanvas向量的最后一个元素设置为另一个TCanvas向量? 问题,c++,qt,root-framework,tcanvas,C++,Qt,Root Framework,Tcanvas,我想开始动态地将TCanvas从程序的“模型”部分传递到“视图”部分。我考虑这样做的方式是,在启动时在视图上简单地创建我的TCanvas,然后在填充图形后用视图TCanvas更新这个TCanvas。我创建了一个测试台,看看它是否能工作 我展示了一种工作方法和一种坏方法 我使用的是QT-ROOT,它是一个定制小部件,本质上是一个返回到TCanvas的小部件 设置我的画布 我试图一次解决一件事。您的错误消息QLayout:试图将QLayout“”添加到GUI::DataTestTab“DataTes

我想开始动态地将TCanvas从程序的“模型”部分传递到“视图”部分。我考虑这样做的方式是,在启动时在视图上简单地创建我的TCanvas,然后在填充图形后用视图TCanvas更新这个TCanvas。我创建了一个测试台,看看它是否能工作

我展示了一种工作方法和一种坏方法

我使用的是QT-ROOT,它是一个定制小部件,本质上是一个返回到TCanvas的小部件

设置我的画布
我试图一次解决一件事。您的错误消息
QLayout:试图将QLayout“”添加到GUI::DataTestTab“DataTestTab”中,它已经有一个布局
源于您正在为QHBoxLayout调用此构造函数:

QHBoxLayout *loH = new QHBoxLayout(this);
如果您查看
QLayout
(例如)的文档,则您正在使用父级调用构造函数(在您的案例中为
this
),文档中会显示:

QLayout::QLayout ( QWidget * parent )
Constructs a new top-level QLayout, with parent parent. parent may not be 0.
There can be only one top-level layout for a widget.
因此,即使您没有明确地将这些布局设置为
DataTestTab
的主布局,Qt也会尝试这样做,因为这就是构造函数的编写方式,这会导致您看到的消息

解决这个问题的显而易见的办法是改变

QHBoxLayout *loH = new QHBoxLayout(this);

然后调用此构造函数:

QLayout::QLayout ()
Constructs a new child QLayout.
This layout has to be inserted into another layout before geometry management will work.
i、 e.
QLayout
,可以添加到另一个布局中(并且必须添加才能工作)

编辑: 我认为你可以简化移交物品的方式。没有理由为每个直方图构造一个
TCanvas
并传递它,特别是因为
TCanvas
不会拥有您的直方图,而且我相信,当您发布
TH1::Draw()
时,即使将
cd()
放入您想要的画布中,这也无法实现您想要做的事情

我使用了您的代码,我可以通过以下方式实现您想要的:

void DataTestWorker::doWork()
{
  static Int_t HistoID = 1;
  std::vector<TH1D*> graphs;
  TString name("h1_");
  for (int i = 0; i <2 ; i++)
    {
      name += HistoID++;
      TH1D *h1 = new TH1D(name.Data(),name.Data(),10,0, 10);
      graphs.push_back(h1);
      graphs.at(i)->Fill(i);
    }
  emit sendGraphData(graphs); //void sendGraphData(std::vector<TH1D*>);     

}
void DataTestWorker::doWork()
{
静态内部组织ID=1;
向量图;
t管柱名称(“h1_”);
对于(int i=0;i填充(i);
}
emit sendGraphData(图形);//void sendGraphData(std::vector);
}

void DataTestTab::drawGraph(std::vector hists)
{
对于(尺寸i=0;icd();
h->Draw();
m_vectorCanvas.at(i)->Refresh();
}
}
显然,我没有执行任何检查以确保
std::vector
std::vector
具有相同的长度等。但是使用此代码,我能够在两个
tcanva
上显示两个直方图,正如您在
this Works
示例中所示


这有帮助吗?

你能举个简单的例子吗()要重新创建问题?@Erik这样一个完整的工作代码,人们可以复制和粘贴?@Erik-虽然有多少人使用QT-ROOT?问题是,例如,我现在没有看到问题,但如果我可以重新创建问题,以便我可以尝试不同的事情,我可能会有所帮助。使用当前的代码,我必须构建一个类这是为了使它能够编译并确保我没有遗漏一些重要的内容。这就是为什么一个自包含的示例很有帮助。@Erik你有QT-ROOT吗?如果有,我今晚将为你制作一个上面的小版本!谢谢你非常详细的回答。我现在正在启动我的笔记本电脑,并将尽快检查。这里的互联网太慢了,不是吗让我花这么长时间来更新它。我只是尝试了一下,它成功了。这两件事。我不认为我能用一个“正确的答案”来奖励你足够多状态。没关系。如果答案有用,你也可以通过点击旁边的向上箭头向上投票。除此之外:you's Welcome我已经做了=P QT-ROOT上几乎没有最新的文档。
QHBoxLayout *loH = new QHBoxLayout(this);
QLayout::QLayout ( QWidget * parent )
Constructs a new top-level QLayout, with parent parent. parent may not be 0.
There can be only one top-level layout for a widget.
QHBoxLayout *loH = new QHBoxLayout(this);
QHBoxLayout *loH = new QHBoxLayout;
QLayout::QLayout ()
Constructs a new child QLayout.
This layout has to be inserted into another layout before geometry management will work.
void DataTestWorker::doWork()
{
  static Int_t HistoID = 1;
  std::vector<TH1D*> graphs;
  TString name("h1_");
  for (int i = 0; i <2 ; i++)
    {
      name += HistoID++;
      TH1D *h1 = new TH1D(name.Data(),name.Data(),10,0, 10);
      graphs.push_back(h1);
      graphs.at(i)->Fill(i);
    }
  emit sendGraphData(graphs); //void sendGraphData(std::vector<TH1D*>);     

}
void DataTestTab::drawGraph(std::vector<TH1D*> hists)
{
  for (size_t i=0; i<m_vectorCanvas.size(); i++)
    {
      TH1D *h = hists.at(i);
      m_vectorCanvas.at(i)->cd();
      h->Draw();
      m_vectorCanvas.at(i)->Refresh();
    }
}