本文共 4006 字,大约阅读时间需要 13 分钟。
static const int s_iWidgetsNumber = 4; // 右侧显示区的图表数量
QWidget * m_pShowWidgets[2][2]; // 右侧显示区的四幅图或表
void MainWindow::CreateCharts()
{
for (int i = 0; i < s_iWidgetsNumber; i++)
{
// 创图表
m_pShowWidgets[i/2][i%2] = new Plot;
ui->frameDisplay->addWidget(m_pShowWidgets[i/2][i%2], i/2, i%2);
connect(m_pShowWidgets[i/2][i%2], SIGNAL(FullScreenToggle(QWidget*,bool)), this, SLOT(OnToggleSize(QWidget*,bool)));
connect(m_pShowWidgets[i/2][i%2], SIGNAL(DragComplete(QWidget*, QString)), this, SLOT(OnDragComplete(QWidget*, QString)));
}
}
signals:
void FullScreenToggle(QWidget* pWidget, bool bFullScreen);
void DragComplete(QWidget* pWidget, QString strTestItem);
void Plot::mouseDoubleClickEvent(QMouseEvent *event)
{
if (Qt::LeftButton == event->button())
{
m_bFullScreen = !m_bFullScreen;
emit FullScreenToggle(this, m_bFullScreen);
}
else if (Qt::RightButton == event->button())
{
if (m_pPlotZoomer != NULL)
m_pPlotZoomer->zoom(0);
}
}
void Plot::dragEnterEvent(QDragEnterEvent *event)
{
DragListWidget *source = dynamic_cast<DragListWidget*>(event->source());
if (NULL == source)
return;
event->setDropAction(Qt::MoveAction);
event->accept();
}
void Plot::dropEvent(QDropEvent *event)
{
DragListWidget *source = dynamic_cast<DragListWidget*>(event->source());
if (NULL == source)
return;
event->setDropAction(Qt::MoveAction);
event->accept();
emit DragComplete(this, event->mimeData()->text());
}
QPointer<CTestItem> m_pTestItems[2][2]; // 显示在界面的四个测试项,与上面的四幅图或表一一对应
void MainWindow::OnDragComplete(QWidget *pWidget, QString itemName)
{
for (int i = 0; i < s_iWidgetsNumber; ++i)
{
if (pWidget == (m_pShowWidgets[i/2][i%2]))
{
// if (itemName.toStdWString().c_str() == m_pTestItems[i/2][i%2]->GetClassName())
// return;
m_pTestItems[i/2][i%2] = CRuntimeClass::LoadObject(itemName.toStdWString().c_str(), &m_pShowWidgets[i/2][i%2]);
// 测试项切换时,如果前后图表的类型不一致,会在CTestItem的构造函数中进行delete和new的操作
// delete操作会消除m_pShowWidgets之前建立起来的父子对象关系以及信号与槽函数的绑定关系,故需重新建立
if (m_pShowWidgets[i/2][i%2]->parentWidget() != ui->frameDisplay)
{
ui->frameDisplay->addWidget(m_pShowWidgets[i/2][i%2], i/2, i%2);
connect(m_pShowWidgets[i/2][i%2], SIGNAL(FullScreenToggle(QWidget*,bool)), this, SLOT(OnToggleSize(QWidget*,bool)));
connect(m_pShowWidgets[i/2][i%2], SIGNAL(DragComplete(QWidget*, QString)), this, SLOT(OnDragComplete(QWidget*, QString)));
}
break;
}
}
}
if (!(m_pShowWidget = qobject_cast<PlotCurve *>(*ppWidget)))
{
qDebug("qobject_cast *>(ppWidget) fail");
delete (*ppWidget);
*ppWidget = NULL;
*ppWidget = m_pShowWidget = new PlotCurve;
}
转载地址:http://qkqu.baihongyu.com/