- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想开始将 TCanvas 从本质上是我程序的“模型”部分动态传递到“ View ”部分。我考虑这样做的方式是在启动时简单地在 View 上创建我的 TCanvas,然后在填充图形后用 View 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();
}
}
这是这个方法的输出:
目前我能看到的唯一错误是我在 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
最佳答案
我正在尝试一次处理一件事情。你的错误信息QLayout: Attempting to add QLayout "" to GUI::DataTestTab "DataTestTab", which already has a layout
源于您正在为 QHBoxLayout 调用此构造函数这一事实:
QHBoxLayout *loH = new QHBoxLayout(this);
如果您查看 QLayout
的文档(例如 http://qt-project.org/doc/qt-4.8/qlayout.html#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);
到
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.
即一个QLayout
可以添加到另一个(并且必须这样做才能工作)。
编辑:我认为您可以简化移交对象的方式。没有理由构建 TCanvas
对于每个直方图并传递它,特别是因为 TCanvas
不会拥有您的直方图,我相信当您发出 TH1::Draw()
时即使有cd()
'进入你想要的 Canvas ,这并没有实现你想要做的事情。
我玩过你的代码,我可以通过简单地实现你想要的:
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();
}
}
我显然没有执行任何检查来确保 std::vector<TH1D*>
和 std::vector<TQtWidget*>
具有相同的长度等。但使用此代码,我能够在两个 TCanvas
上显示两个直方图。正如你在 This Works
中展示的那样例子。
这有帮助吗?
关于c++ - 如果我将一个 TCanvas vector 传递给另一个类,为什么 ROOT 只允许我将一个 TCanvas vector 的最终元素设置为另一个 TCanvas vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26255470/
问题 我想开始将 TCanvas 从本质上是我程序的“模型”部分动态传递到“ View ”部分。我考虑这样做的方式是在启动时简单地在 View 上创建我的 TCanvas,然后在填充图形后用 View
我想创建一个TCanvas,这样我就可以更轻松地绘图。首先,我创建 Canvas MyCanvas:=TCanvas.Create;,然后获取句柄 DC:=GetWindowDC(Handle); 现
我正在使用这个 TCanvas 为我的鼠标绘制光标 Canv := TCanvas.Create; Canv.Handle := GetWindowDC(0); …… 对于每个老鼠事件,请执行以下操作
问题 我有一个 32 位像素数据数组,用于保存位图图像。 TPixel = packed record B: Byte; G: Byte; R: Byte; A: Byte; end;
令我惊讶的是,我发现在 TCanvas 上重复渲染文本在某种程度上是“附加的”。我意识到设置 Canvas.Brush.Style:=bsClear 是问题的原因,但我确实需要透明且重复地渲染文本(即
我正在尝试制作一个“空白”背景以在其上放置图像。通过将 TImage 放置在表单上并执行以下操作来创建剖面线并不太困难: image1.Canvas.brush.Style := bsDiagCros
不确定我是否在这里遗漏了一些东西,但是你可以在 Firemonkey TCanvas 中设置字体颜色吗? 我在以下属性中没有看到任何建议: Canvas.Font. ???? 任何帮助都会很棒 谢谢
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我正在使用 TextOut() 在 TCanvas 上绘制文本,但我想要更大的字体。 我能做什么? 最佳答案 试试这个 Canvas.Font.Size := ; Canvas.TextOut(0,0
在我的应用程序中,我需要在 TCanvas 上绘制一个“标记”,例如 Google map 标记(参见图片)。 我想使用半径、高度和原点作为参数: 我不知道要使用的算法。我可以使用圆弧来绘制顶部,但是
我需要什么 我需要获取 Firemonkey 组件的 TCanvas 的 DC。我需要它来使用无法通过 Firemonkey 访问的 Win API 绘图功能,主要是 100% 控制字体渲染。 显然,
最近我发现对于 TIcon 实例的对象,TCanvas.StretchDraw 无法按预期工作(快速查看 TIcon.Draw code> 和 DrawIconEx 方法告诉了原因)。德尔福help承
我正在使用 TextOut() 在 TCanvas 上绘制文本,但我需要不同的文本颜色。 我能做什么? 最佳答案 更改 Canvas 字体的颜色 Canvas.Font.Color := ; 关于de
我需要创建一个过程,例如: procedure GdiPie(Canvas: TCanvas; X1: Integer; Y1: Integer; X2: Integer; Y2: Integer;
我为我的公司编写了一个从图元文件到 SVG 的转换器(TCanvas->arc)。我已经完成了矩形或其他一些元素的转换,但我不知道如何转换圆弧。我用 JavaScript 编写代码。 :) 我有一个文
假设我有一个包含两个 TGraphs 的宏:T1 和 T2 并且我有一个 Canvas “C>”分为两部分: TCanvas *C = new TCanvas("","",0,0,400,400);
绘制到屏幕的规则是什么? 我的最终目标是将 TCanvas 放入一个类中并从那里绘画,但现在我认为也许看一个不太复杂的例子可能会有所帮助。下面是一些在我的计算机上编译并绘制到屏幕上的代码。 # inc
我开发了以下 AnimateRects() 方法来在 Windows 桌面上绘制动画矩形。我用它来动画显示模态表单,使它看起来像是从网格单元格中“生长”出来的。 在表单显示之前,我使用 bExpand
我有一个非常简单的 FireMonkey 应用程序,它只有一个表单,在 OnPaint 事件中有以下代码。当我使用 Windows 目标运行它时,我看到一条红线和一个红色方 block 。当我在我的
考虑以下代码: procedure TForm1.PaintBox1Paint(Sender: TObject); var vRect : TRect; vFormat : TTextForm
我是一名优秀的程序员,十分优秀!