文章 "图形界面 X: 在多行文本框中选择文本 (集成构建 13)" - 页 5

 
Pavel Kolchin:
@Pavel Kolchin,要防止交易箭头悬挂在面板上,请使用CWndEvents::ResetWindow() 方法。
 
Anatoli Kazharski:

是的,但有一个问题,长时间使用时会无缘无故出现错误,删除 EA 子窗口会导致 EA 被删除

图像

 
Pavel Kolchin:

是的,但有一个问题,当长时间使用时,会无缘无故出现错误,删除 EA 子窗口会导致删除 EA

Defines.mqh 文件中,将EXPERT_IN_SUBWINDOW 参数设置为false

//+------------------------------------------------------------------+
//|定义。mqh
///2015年,MetaQuotes Software Corp.版权所有。
//|http://www.mql5.com | |
//+------------------------------------------------------------------+
//--- 窗口模式下的专家
#define  EXPERT_IN_SUBWINDOW false

//---

对于图形界面 位于图表主窗口的智能顾问,该参数值应为false

 
Anatoli Kazharski:

Defines.mqh 文件中,将EXPERT_IN_SUBWINDOW 参数设置为false


很明显,有一个函数可以工作,可以工作,可以工作(几天),然后又失败。


//+------------------------------------------------------------------+
//| 检查并更新 "智能交易系统 "窗口的编号
//+------------------------------------------------------------------+
void CWndEvents::CheckExpertSubwindowNumber(void)
  {
//--- 如果不是专家,则退出
   if(PROGRAM_TYPE!=PROGRAM_EXPERT)
      return;
//--- 获取图形上子窗口的数量
   int subwindows_total=(int)::ChartGetInteger(m_chart_id,CHART_WINDOWS_TOTAL);
//--- 如果子窗口数量和指标数量没有变化,则退出
   if(subwindows_total==m_subwindows_total)
      return;
//-- 保存当前子窗口的数量
   m_subwindows_total=subwindows_total;
//--- 检查是否存在专家子窗口
   bool is_subwindow=false;
//--- 查找专家的子窗口。
   for(int sw=0; sw<subwindows_total; sw++)
     {
      //--- 如果存在专家子窗口,则停止循环
      if(is_subwindow)
         break;
      //--- 该窗口/子窗口中有多少个指标
      int indicators_total=::ChartIndicatorsTotal(m_chart_id,sw);
      //--- 让我们查看窗口中的所有指标 
      for(int i=0; i<indicators_total; i++)
        {
         //--- 获取指标的简称
         string indicator_name=::ChartIndicatorName(m_chart_id,sw,i);
         //--- 如果这不是专家子窗口,则转到下一个子窗口
         if(indicator_name!=m_subwindow_shortname)
            continue;
         //--- 注意,EA 子窗口是
         is_subwindow=true;
         //--- 如果子窗口编号发生变化,则 
         // 我们需要在主表单的所有元素中保存新数字
         if(sw!=m_subwin)
           {
            //--- 保存子窗口编号
            m_subwin=sw;
            //--- 让我们把它也保存在界面主窗体的所有元素中
            int elements_total=CWndContainer::ElementsTotal(0);
            for(int e=0; e<elements_total; e++)
               m_wnd[0].m_elements[e].SubwindowNumber(m_subwin);
           }
         //---
         break;
        }
     }
//--- 如果未找到专家顾问子窗口,则删除专家顾问
   if(!is_subwindow)
     {
      ::Print(__FUNCTION__," > 删除 EA 子窗口会导致 EA 被删除!");
      //--- 从图表中移除智能交易系统
      ::ExpertRemove();
     }
  }
 
Pavel Kolchin:


很明显,有一个功能可以工作几天,然后就失效了。

您使用的不是最新版本的库,或者对其进行了修改。这个方法的开头应该有这样一个条件:

//--- 如果 (1) 不是 EA 或 (2) EA 图形用户界面在主窗口中,则退出
   if(PROGRAM_TYPE!=PROGRAM_EXPERT || !EXPERT_IN_SUBWINDOW)
      return;

//---

而你有

//--- 如果不是专家,则退出
   if(PROGRAM_TYPE!=PROGRAM_EXPERT)
      return;
 
Anatoli Kazharski:

您使用的不是最新版本的程序库,或者对其进行了编辑。在这个方法的开头应该有这样的条件:

是的,我认为这样更好)。

您使用的是 10.2 版,因此它拥有我需要的所有菜单项,并且支持 mt4。

从那时起是否有其他可能影响工作的重要更改?

 
Pavel Kolchin:

...

此后是否有其他可能影响性能的重要修改?

现在还很难说。有些东西会不断添加和修正。
 

最好能在表单中添加一种机制,用于根据 Qt 中的 "工厂 "原则或类似原则添加对象,而且最好能相互定位:

- 右

- 左

- 上

- 下

 
Konstantin:

最好能在表单中添加一种机制,用于按照 Qt 中的 "工厂 "原则或类似原则添加对象,而且最好能相互定位:

- 右

- 左

- 上

- 下

请详细说明。我不知道 Qt 是如何实现的。

现在,元素可以相对于表单进行定位:右、左、上、下。只有窗体可以作为父元素。在下一个版本中,可以将任何其他元素设置为父元素。这将使元素管理和定位变得更加简单。

 
Anatoli Kazharski:

请更详细地描述一下。我不知道 Qt 是如何实现的。

现在,元素可以相对于表单进行定位:右、左、上、下。只有表单可以作为父元素。在下一个版本中,可以将任何其他元素设置为父元素。这将使元素管理和定位变得更加容易。


在 Qt 中是一个工厂函数:

QWidgetAction *createWidget();

这就是创建 widget 的测试方法:

QWidget * widget() {
   static QWidget * inst = new QWidget;
   return inst;
}

这里是 关于 QWidget 的所有信息。

现在,元素可以相对于窗体 进行定位:右、左、上、下

我不太明白,这个相对于边框的元素定位,是否既可以放在表单后面,也可以放在表单里面?

例如,有一个表单,我们是否可以将元素相对于表单的左边界向左定位?