This forum has been archived. All content is frozen. Please use KDE Discuss instead.

关于 lrcShow-X 的平滑滚动

Tags: None
(comma "," separated)
User avatar
nihui
Registered Member
Posts
26
Karma
0
OS

关于 lrcShow-X 的平滑滚动

Mon Dec 21, 2009 7:24 am
今天下午尝试为 sanfanling 的 lrcShow-X 弄成平滑滚动
结果是歌词一开始很顺畅,到中间的时候就一卡一卡的。。

个人认为是 pyqt4 自己的效率有问题....
QTimeLine 这个东西明明是设好范围的,比如 100 到 140,结果第一帧就从 120 开始了..难怪显示的时候会“跳帧”...

btw: 发现发帖子没办法加附件...

Patch: lrcShow-X-smoothscroll-try.patch

Code: Select all
Index: mainGuiQt4.py
===================================================================
--- mainGuiQt4.py   (版本 205)
+++ mainGuiQt4.py   (工作副本)
@@ -578,8 +581,10 @@
             for i in range(len(self.tag)+(self.lineNum-1)/2-1):
                self.moveCursor(QTextCursor.Down)
             self.highLight()
-            self.hPos=self.margin*len(self.tag)
-            self.verticalScrollBar().setValue(self.hPos)
+            if self.animateTimer.endFrame() != self.margin*len(self.tag):
+               self.hPos=self.margin*len(self.tag)
+               self.verticalScrollBar().setValue(self.hPos)
          
       else:
          if(self.lineNum==1 and self.horizontal=='yes'):
@@ -603,8 +608,10 @@
             else:
                self.mytimer.start(self.tag[p]-currentTime)
             try:
-               self.hPos=self.margin*(self.num-1)
-               self.verticalScrollBar().setValue(self.hPos)
+               if self.animateTimer.endFrame() != self.margin*(self.num-1):
+                  self.hPos=self.margin*(self.num-1)
+                  self.verticalScrollBar().setValue(self.hPos)
                if(self.lineNum != 1):
                   self.highLight()
             except:
@@ -748,17 +755,21 @@
             self.showInfo('<p align="center">'+_('Welcome to lrcShow-X')+'</p>')
    
    def animateEffect_scroll(self, value):
+      print value
       if(self.lineNum==1 and self.horizontal=='yes'):
          self.horizontalScrollBar().setValue(value)
       else:
          self.verticalScrollBar().setValue(value)
 
+   def scrollToAnchor(self,name):
+      pass
+
    def highLight(self):
       if(self.lineNum==1 and self.horizontal=='yes'):
          pass
       else:
          self.moveCursor(QTextCursor.StartOfLine)
-              self.moveCursor(QTextCursor.NextBlock,QTextCursor.KeepAnchor)
+         self.moveCursor(QTextCursor.NextBlock,QTextCursor.KeepAnchor)
 
    def scrollContent(self):# to scoll the lrc
       self.num+=1
@@ -775,9 +786,10 @@
          else:
             interval = 500
          self.hPos = self.hPos+marginTmp
-         self.initAnimateTimer(interval, self.hPos-marginTmp, self.hPos)
          self.mytimer.start(next_time)
+         self.initAnimateTimer(next_time, self.hPos-marginTmp, self.hPos)
       else:
+         print "END"
          if(self.lineNum==1 and self.horizontal=='yes'):
             marginTmp = self.fragmentLength[-2]/2+self.fragmentLength[-1]/2+self.fixLength
          else:
@@ -786,11 +798,17 @@
          self.initAnimateTimer(500, self.hPos-marginTmp, self.hPos)
    
    def initAnimateTimer(self, interval, startPos, stopPos):
+      print interval, startPos, stopPos
       if(self.animateTimer.state() == 2):
-         self.animateTimer.stop()
+         print "pre is running"
+         if self.animateTimer.endFrame() != stopPos:
+            print "stop the pre"
+            self.animateTimer.stop()
          self.highLight()
+      self.animateTimer.stop()
       self.animateTimer.setFrameRange(startPos, stopPos)
       self.animateTimer.setDuration(interval)
+      self.animateTimer.setUpdateInterval(40)
       self.animateTimer.start()
 
    def initTime(self):


Akonadi · aRts · D-Bus · Decibel · Flake · KJS · KDOM · KHTML · KIO · Kiosk · KIPI · KParts · Kross · KSVG · KWin · NEPOMUK · Oxygen · Phonon · Plasma · Qt · Solid · Sonnet · Soprano · Strigi · ThreadWeaver · WebKit · XMLGUI
frank1980
Registered Member
Posts
38
Karma
0
一开始的时候我也考虑过类似ttplayer的那种“时刻在动”的效果,但是最后还是决定使用现在的那种有静止状态的效果,还是一个个人喜好问题。
QTimeLine也是最近看了朋友的一个demo后决定采用的,一开始并不知道有这么一个类。之后代码精简的很多,效果也非常满意。
这个补丁我打上试试,请问nihui,是不是基于最新的SVN205?
frank1980
Registered Member
Posts
38
Karma
0

Re: 关于 lrcShow-X 的平滑滚动

Mon Dec 21, 2009 10:34 am
还有个挺好玩的事情和nihui分享下
lrcShow-X采用了选中文本的方式实现当前歌词的高亮,并设定选中文本的背景色和widget的背景色相同,这里使用了QPalette实现的。如果采用setStyleSheet的方式改变widget的颜色,会有选中文本的背景色和widget的背景色出现略微色差的问题。
后来发现,只要使用了setStyleSheet,不管是不是用来改变颜色,哪怕是仍旧采用QPalette来改色,也会出现上述中的色差。不知道是不是一个bug

把以下代码替换同名函数试试,不知道是不是我的特例。

Code: Select all
def initColor(self,a,b,c):# to set colors
      if(self.transEffect == 'yes'):
         self.setStyleSheet('QTextBrowser {background-color: QColor(0,0,0,0,0); color: %s; selection-background-color: QColor(0,0,0,0,0); selection-color: %s}' %(b.name(), c.name()))
      else:
         self.setStyleSheet('QTextBrowser {background-color: %s; color: %s; selection-background-color: %s; selection-color: %s}' %(a.name(), b.name(), a.name(), c.name()))
frank1980
Registered Member
Posts
38
Karma
0
svn211改进了歌词编辑器(改动很大),目前已经支持直接编辑内嵌歌词了。这个好像千千静听目前做不到。


Bookmarks



Who is online

Registered users: Bing [Bot], Google [Bot], kesang, Sogou [Bot], Yahoo [Bot]