关于QLabel 的setText()

meiky 2013-02-06 03:19:29
QLabel 的一对象,不断地进行setText(str);str是一个变化的字符串,这样不停地刷新后整个线程越来越卡,就是执行setText()越来越慢,这到底是为什么,我需要不停地实时刷新一个QLabel,如果刷新的字符串不变,就刷再多次也不卡,为什么????
...全文
2100 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
dutxin 2014-07-17
  • 打赏
  • 举报
回复
楼主最后怎么解决的啊?
meiky 2013-02-08
  • 打赏
  • 举报
回复
引用 24 楼 openXMPP 的回复:
引用 22 楼 meiky 的回复:真是openXMPP说的那样,QLabel把他的父窗口也更新了,怎么会这样,怎么办?????,而且耗时越来越多的不是QLabel,而是其它地方,估计是父窗口重绘。我的QLabel得放在父窗口上啊,怎么办?? 你的QLabel必须指定父窗口吗 如果不是必须的话 完全可以这样 以前是 QLabel * youLabel = new……
我知道可以这样,不指定就行,但每个QLabel我都得置顶,而且风格也得重新画,原来我是画了父窗口风格,子窗口所有的风格都跟着改。还有其它办法吗?也奇怪,我父窗口的paintEvent()里那些东西也不会跑多几下就变卡啊,我等下再调调具体卡在哪。 很多人都急着过年,我们这群IT兄弟还在干活,各位辛苦了,大家新快乐!
meiky 2013-02-07
  • 打赏
  • 举报
回复
引用 16 楼 openXMPP 的回复:
其实我建议lz还是做个计时算下 QTime startTime = QTime::currentTime(); //your function QTime endTime = QTime::currentTime(); qDebug()<<" elapse time is "<< startTime.msecsTo(endTime); 单位是毫秒 Qt助手……
谢谢,这个很有可能。也谢谢版主,我正在试,也一直时间是0. 我想重新弄个工程来调试,怎么老undefined reference to `vtable for KFrame',以前都没出现过, 加进信号就会,moc的问题,这个再研究。我先在原来工程上试。
  • 打赏
  • 举报
回复
做了个在下面, 没发现问题。 qDebug() 稳定输出1和0.。。。 没跑多久 只跑了2分钟。 #include "widget.h" #include "ui_widget.h" #include <QLabel> #include <QDebug> #include <QTime> Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); m_timer = new QTimer(this); connect(m_timer,SIGNAL(timeout()),this,SLOT(onTimerTriggered())); m_timer->start(80); } Widget::~Widget() { delete ui; } void Widget::onTimerTriggered() { static int i = 0; i++; QTime time; time.start(); ui->label->setNum(i); qDebug() << time.elapsed(); }
meiky 2013-02-07
  • 打赏
  • 举报
回复
引用 15 楼 allencui0313 的回复:
需要全部的代码哈。
class Frame : public QFrame { Q_OBJECT public: ...... QLabel *lbValue; ...... public slots: void timeProcess(); } lbValue 在构造函数中有 lbValue = new QLabe…… int main(int argc, char **argv) { QApplication App(argc,argv); QTimer *ImageTimer =new QTimer(); Frame *myFrame = new Frame ; myFrame->setGeometry(0,0,100,100); QObject::connect(ImageTimer ,SIGNAL(timeout()),myFrame ,SLOT(timeProcess())); ImageTimer->start(80); myFrame->show(); return App.exec(); } void Frame ::timeProcess() { static int i=0; i++; lbValue->setNum(i);//这函数会越来越卡 } 程序大概如上面,我这代码比较多,没办法全部贴上来,上面我自己抽象出来的,版主可以帮忙类似调一下,
乔巴好萌 2013-02-07
  • 打赏
  • 举报
回复
其实我建议lz还是做个计时算下 QTime startTime = QTime::currentTime(); //your function QTime endTime = QTime::currentTime(); qDebug()<<" elapse time is "<< startTime.msecsTo(endTime); 单位是毫秒 Qt助手上说 Note that QLabel is well-suited to display small rich text documents, such as small documents that get their document specific settings (font, text color, link color) from the label's palette and font properties. For large documents, use QTextEdit in read-only mode instead. QTextEdit can also provide a scroll bar when necessary. 每次setText()会清掉以前的数据,然后显示新数据,如果数据少是没问题的(个人感觉数据量小定义为几十KB或更大),数据大的话推荐QTextEdit,但看你的代码,不是数据量大小的问题。 setText()如果你的Qlabel和别的widget有关联,看是否会引起其他的地方重绘,这个是关键
  • 打赏
  • 举报
回复
需要全部的代码哈。
meiky 2013-02-07
  • 打赏
  • 举报
回复
引用 13 楼 allencui0313 的回复:
囧为啥用timer... 为啥不mousemove的时候去触发?
不是,我是说我测试这卡的问题就用定时器,鼠标移动更新我是用mouseMoveEvent 触发的,就发现鼠标移动多次后变卡。
  • 打赏
  • 举报
回复
囧为啥用timer... 为啥不mousemove的时候去触发?
jdwx 2013-02-07
  • 打赏
  • 举报
回复
引用 10 楼 meiky 的回复:
引用 7 楼 jdwx1 的回复:引用 2 楼 meiky 的回复:引用 1 楼 jdwx1 的回复:不会出这样的问题,没看见代码,不好说。 class Frame : public QFrame { public: ...... QLabel *lbValue; ...... } lbValue 在构造函数中有 lb……
多长时间调用:void Frame::updateDisplay()一次? 太快了肯定是不行,逐渐增大间隔。
meiky 2013-02-07
  • 打赏
  • 举报
回复
引用 8 楼 allencui0313 的回复:
确定是setText的原因? updateDisplay是如何被调用的?
updateDisplay 本来我是在鼠标移动的时候调用,发现鼠标移动一阵子后越来越卡,现在调试用个定时器定时调用它,不断更新显示数字,可以明显看到更新的数据越来越慢。定时器stop()后数字也就没更新了,证明消息处理也及时,而且停下来后就不卡了。
meiky 2013-02-07
  • 打赏
  • 举报
回复
引用 7 楼 jdwx1 的回复:
引用 2 楼 meiky 的回复:引用 1 楼 jdwx1 的回复:不会出这样的问题,没看见代码,不好说。 class Frame : public QFrame { public: ...... QLabel *lbValue; ...... } lbValue 在构造函数中有 lbValue = new QLabe……
void Frame::updateDisplay()//这个函数用定时器不断调用 { char str[10]; static int i=100; i++;//上面少写了这一句 sprintf(str,"%d",i); lbValue->setText(str);//这函数会越来越卡 } 这只是我测试代码,有i++,用lbValue.setNum(i);现象也是一样
meiky 2013-02-07
  • 打赏
  • 举报
回复
引用 6 楼 openXMPP 的回复:
没看明白 setText()你在函数调用前后做时间计数了? 如果没有计算耗时 怎么算出来 越来越卡的?
没有具体计算调用函数的时间,但是我那线程加了调用setText()后就会出现越来越卡的现象,屏蔽掉就不会。很明显是这句的问题。
乔巴好萌 2013-02-07
  • 打赏
  • 举报
回复
引用 22 楼 meiky 的回复:
真是openXMPP说的那样,QLabel把他的父窗口也更新了,怎么会这样,怎么办?????,而且耗时越来越多的不是QLabel,而是其它地方,估计是父窗口重绘。我的QLabel得放在父窗口上啊,怎么办??
你的QLabel必须指定父窗口吗 如果不是必须的话 完全可以这样 以前是 QLabel * youLabel = new QLabel(parent); 改成这样 QLabel *yourlabel = new QLabel(); //设置父窗口为空
蜡笔小新啦 2013-02-07
  • 打赏
  • 举报
回复
引用 22 楼 meiky 的回复:
真是openXMPP说的那样,QLabel把他的父窗口也更新了,怎么会这样,怎么办?????,而且耗时越来越多的不是QLabel,而是其它地方,估计是父窗口重绘。我的QLabel得放在父窗口上啊,怎么办??
你怎么知道的?
  • 打赏
  • 举报
回复
确定是setText的原因? updateDisplay是如何被调用的?
meiky 2013-02-07
  • 打赏
  • 举报
回复
真是openXMPP说的那样,QLabel把他的父窗口也更新了,怎么会这样,怎么办?????,而且耗时越来越多的不是QLabel,而是其它地方,估计是父窗口重绘。我的QLabel得放在父窗口上啊,怎么办??
乔巴好萌 2013-02-07
  • 打赏
  • 举报
回复
进入代码目录 重新执行下qmake 然后make
引用 19 楼 meiky 的回复:
引用 16 楼 openXMPP 的回复: 其实我建议lz还是做个计时算下 QTime startTime = QTime::currentTime(); //your function QTime endTime = QTime::currentTime(); qDebug()<<" elapse time is "<< startTime.msecsTo(endTime); 单位是……
jdwx 2013-02-06
  • 打赏
  • 举报
回复
引用 2 楼 meiky 的回复:
引用 1 楼 jdwx1 的回复:不会出这样的问题,没看见代码,不好说。


class Frame : public QFrame
{
public:
......
QLabel *lbValue;
......
}

lbValue 在构造函数中有 lbValue = new QLabel();

void Fram……

看代码没发现该变文字的地方,要显示数字用QString::number(123);就可以代替你那好几行代码。
QLabel有直接set数字的槽
乔巴好萌 2013-02-06
  • 打赏
  • 举报
回复
没看明白 setText()你在函数调用前后做时间计数了? 如果没有计算耗时 怎么算出来 越来越卡的?
加载更多回复(5)

16,235

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧