• 3818阅读
  • 11回复

请问在静态函数里怎么访问UI 控件 [复制链接]

上一主题 下一主题
离线gy19920615
 

只看楼主 倒序阅读 楼主  发表于: 2017-12-21
我写的代码里有个线程函数,处理传进来的数据显示到主窗口的控件上,因为是静态函数所以不能直接访问ui控件,我用UserData作为指针来传递ui控件,编译能够通过,但是接上CAN盒子运行,窗口就卡死,已经查明了就是 ((UI::MainWindow*)UserData)->NUMERIC_C1->setText(tempStr.setNum(c1));这个代码的问题,注释掉以后不会卡死。请问有什么解决办法吗?正确的访问UI控件的方法是怎么样的?
static DWORD __stdcall  ThreadPDOTest(DWORD eventID, LPVOID pBuf, DWORD BufLen, LPVOID UserData )
{
           int ERR1=-1, ERR2=-1,ERR3=-1,i=0
           unsigned char data[8];
           DWORD  dwDataLen;
           in data_in=0;
           QSTring  tempStr;
           float  c1=0,c2=0,c3=0,c4=0;
            if(EventID==2)
              {
              for (i=0;i<=10;)
                  {
                  ERR1= ZCOMA_GetPDOIputData(hdChannel, 17, 0X191, data, &dwDataLen,0);  //传入数据报文
                  if(ERR1==0)
                       {
                         c1=(float)((256*data[1]+data[0])-512)*1.5/1000;        //计算电压
                         ((UI::MainWindow*)UserData)->NUMERIC_C1->setText(tempStr.setNum(c1));     //将ui指针通过UserData传入,这个地方出现问题
                         c2=....;
                        ........;
                         c3=...;
                         . .......;
                        }
                  }
                }
     }
离线breezeblow

只看该作者 1楼 发表于: 2017-12-21
使用信号槽处理
离线gy19920615

只看该作者 2楼 发表于: 2017-12-21
回 breezeblow 的帖子
breezeblow:使用信号槽处理 (2017-12-21 15:03) 

新人刚接触界面开发,可否讲具体点~
离线yanwuyue

只看该作者 3楼 发表于: 2017-12-22
Qt的界面只能在主线程运行,次线程运行就崩了,你要用Qt必须了解Qt的信号与槽这个机制
离线gy19920615

只看该作者 4楼 发表于: 2017-12-22
好吧~
离线gy19920615

只看该作者 5楼 发表于: 2017-12-22
回 yanwuyue 的帖子
yanwuyue:Qt的界面只能在主线程运行,次线程运行就崩了,你要用Qt必须了解Qt的信号与槽这个机制 (2017-12-22 08:40) 

好吧,谢谢回复
离线九重水

只看该作者 6楼 发表于: 2017-12-23
DWORD ?LPVOID? 楼主以前是玩什么的?VC?
QT很好的一个东西就是信号和槽,好好学学。
离线gy19920615

只看该作者 7楼 发表于: 2017-12-25
回 九重水 的帖子
九重水:DWORD ?LPVOID? 楼主以前是玩什么的?VC?[表情]
QT很好的一个东西就是信号和槽,好好学学。[表情]
 (2017-12-23 10:12) 

之前的上位机是labwindows写的
离线twodiamond

只看该作者 8楼 发表于: 2018-01-12
也不对呀,静态函数怎么能发送信号呢?
离线gy19920615

只看该作者 9楼 发表于: 2018-01-29
回 twodiamond 的帖子
twodiamond:也不对呀,静态函数怎么能发送信号呢? (2018-01-12 16:09) 

编译能通过,运行就未响应了,那要如何才能吧毁掉函数里的数据显示到界面呢?
离线大漠之鹰

只看该作者 10楼 发表于: 2018-01-29
为什么一定要用静态函数阿?不用静态函数可以用信号槽机制来更新界面
用静态函数可以把结果保存到一个list中,主线程定时查看list来显示也可以
本是后山人,偶作前堂客,醉舞经阁半卷书,坐井说天阔。大志戏功名,海斗量福祸,论到囊中羞涩时,怒指乾坤错
QQ:874164244
离线cangyuegui

只看该作者 11楼 发表于: 2018-01-30
首先必须使用出发signal的方法,让事情进入事件循环排队
static DWORD __stdcall  ThreadPDOTest(DWORD eventID, LPVOID pBuf, DWORD BufLen, LPVOID UserData )
{
YOUClass *pClass = static_cast<YOURClass*>(UserData);
if (pClass == NULL)
{
    return NULL;
}

pClass->emitDoSignal();
}

此外你的类中要添加定义
YOUClass
{
public:
YOUClass ()
{
connect(this,&YOUClass::doSignal, this, &YOUClass ::toDo);
}
signals:
void doSignal();

public:
void emitDoSignal()
{
emit doSignal();
}

private slots:
void toDo(){};
}
快速回复
限100 字节
 
上一个 下一个