我刚在子线程中用信号槽:如下,那个drawEcg1Wave()函数是继承QWidget类中的函数,也贴在下面。当我在2440的板子上跑我那个程序时,打印出QPixmap: It is not safe to use pixmaps outside the GUI thread, 这知道这话意思是说在非GUI线程中画图不安全。我现在的问题是当我发送信号后,怎么让drawEcg1Wave()函数在主线程中运行呢。 谢谢
UrineShowThread::UrineShowThread(QDialog *par)
:parent(par)
{
connect(this, SIGNAL(callMainProcessRepaint()), parent, SLOT(drawEcg1Wave()), Qt::DirectConnection);
}
VOID UrineShowThread::DrawEcg1Wave(UINT wParam)
{
// INT16 resample_data[RESAMPLE_MAX_NUM];
// 閲嶉噰鏍峰鐞? wParam鍊肩殑鑼冨洿鍦?锛?096锛屾鍑芥暟浣滅敤鎶妛Param鍊兼斁鍒皊ample鏁扮粍涓?澶у皬涓?0
UpdateResampleWaveData( gEcg1SpeedScale, wParam);
UpdateResampleRPeak( gEcg1SpeedScale, gFlagMan.IsRPeak());
UpdateResamplePace( gEcg1SpeedScale, gFlagMan.IsPacePulse());
// move the ecg wave buffer read pointer
gEcg1WaveBufReadPtr++;
if ( gEcg1WaveBufTail < gEcg1WaveBufReadPtr )
gEcg1WaveBufReadPtr = gEcg1WaveBufHead;
if (CanResampleWaveData(gEcg1SpeedScale))
{
// Resample(gEcg1SpeedScale, resample_data);
Resample(gEcg1SpeedScale, ecg1DrawData);
}
else
return;
ecg1NeedDraw = true;
emit callMainProcessRepaint(); //在此处发送信号
}
void UrineCheck::drawEcg1Wave(/*QPainter &ecg1Painter*/)
{
if (ecg1DrawData.isEmpty())
return;
int yPos;
QQueue<int> tempQue = ecg1DrawData;
ecg1DrawData.clear();
QPainterPath painterPath;
QPen linePen(Qt::green);
QPainter ecg1Painter;
ecg1Painter.begin(pixEcg1);
ecg1Painter.setPen(linePen);
//=================================================鏄捐蹇冭烦
if (GetResampleRPeak(gEcg1SpeedScale))
{
}
//==================================================鐢绘尝褰? painterPath.moveTo(WaveEcg1X, WaveEcg1Y);
while (!tempQue.isEmpty())
{
yPos = tempQue.dequeue();
if (WaveEcg1X > ECG1WIDTH)
{
WaveEcg1X = 0;
painterPath.moveTo(WaveEcg1X, WaveEcg1Y);
}
WaveEcg1Y = ECG1HEIGHT - ECG1HEIGHT/2 - (yPos-0x800)*5*ECG1HEIGHT/0x1000/2;
// printf("wave Ecg1 Ypos: %d\n", WaveEcg1Y);
if (WaveEcg1Y < 0)
WaveEcg1Y = 0;
if (WaveEcg1Y > ECG1HEIGHT)
WaveEcg1Y = ECG1HEIGHT;
ecg1Painter.fillRect(WaveEcg1X, 0, 5, ECG1HEIGHT, Qt::black);
painterPath.lineTo(WaveEcg1X++, WaveEcg1Y);
}
ecg1Painter.drawPath(painterPath);
painterPath.closeSubpath();
//================================================== 鏄捐pace
QPen pacePen(Qt::red);
ecg1Painter.setPen(pacePen);
if (GetResamplePace(gEcg1SpeedScale) && ON == gEcgConfig.paced)
{
painterPath.moveTo(WaveEcg1X, 2);
painterPath.lineTo(WaveEcg1X, ECG1HEIGHT-2);
ecg1Painter.drawPath(painterPath);
}
ecg1Painter.end();
repaint(0, 0, ECG1WIDTH, ECG1HEIGHT);
}