2012-08-03 66 views
1

我有兩個子類。一個實現qplaintextedit,另一個qtextedit。 qtextedit被用來顯示qplaintextedit的行號。我的問題是讓這兩個人同時滾動。我試過self.viewport()。scroll(),它實際上沒有做任何事情。我試過連接qscrollbars,但是qplaintextedit的最大值比qtextedit小。我已經嘗試過我已經嘗試了其他幾種解決方案來解決行號問題,並且他們不允許您在其上使用樣式表。有沒有同時滾動的方法,或者失敗的方法是可行的線號碼?我正在使用python 2.7的pyside。這是我目前使用的代碼。Pyside同時滾動兩個qtextedits

class NumberBar(QTextEdit): 
def __init__(self): 
    super(NumberBar,self).__init__() 
    self.count = 1 
    self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) 
    self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) 
    self.width = self.fontMetrics().width(unicode(10000)) 
    self.setFixedWidth(self.width) 
    self.setStyleSheet("background:transparent;border:0px;") 
    self.setTextInteractionFlags(Qt.NoTextInteraction) 
    self.viewport().setCursor(Qt.ArrowCursor) 
    self.curse = QTextCursor(self.document()) 
    self.curse.insertText(str(1)) 
def change(self, new): 
    if new > self.count: 
     self.curse.movePosition(self.curse.End) 
     self.curse.insertBlock() 
     self.curse.insertText(str(new+1)) 
     self.count = new 
    else: 
     self.curse.movePosition(self.curse.End) 
     self.curse.select(self.curse.BlockUnderCursor) 
     self.curse.removeSelectedText() 
     self.count = new 
    print self.verticalScrollBar().minimum(),self.verticalScrollBar().maximum() 
def onload(self, new): 
    while(new > self.count): 
     self.curse.movePosition(self.curse.End) 
     self.curse.insertBlock() 
     self.curse.insertText(str(self.count+1)) 
     self.count += 1 
def updateContents(self, rect, scroll): 
    if scroll: 
     print scroll 
     self.viewport().scroll(0, scroll) 
     self.update() 
    else: 
     self.update() 

class Editor(QWidget): 
    def __init__(self,text = None,name=None): 
     super(Editor,self).__init__() 
     self.layout = QHBoxLayout() 
     self.layout.setContentsMargins(0,0,0,0) 
     self.layout.setSpacing(0) 
     self.number_bar = NumberBar() 
     self.edit = TextEdit(self.number_bar,text) 
     highlighter = highlight.Highlighter(self.edit.document(),name) 
     #self.edit.blockCountChanged.connect(self.number_bar.adjustWidth) 
     self.edit.updateRequest.connect(self.number_bar.updateContents) 
     self.layout.addWidget(self.number_bar) 
     self.layout.addWidget(self.edit) 
     self.setLayout(self.layout) 

class TextEdit(QPlainTextEdit): 
    def __init__(self,numbar,text = None): 
     super(TextEdit,self).__init__(text) 
     sheet = open("sheet.css",'r').read() 
     self.setStyleSheet(sheet) 
     self.setLineWrapMode(self.NoWrap) 
     self.setViewportMargins(0,0,0,0) 
     self.document().blockCountChanged.connect(numbar.change) 
     numbar.onload(0 if not text else text.count('\n')) 
     self.numbar = numbar 
     numbar.verticalScrollBar().show() 

我已經試過代碼here,但不能由一個樣式表的樣式。

+0

你能提供一些正在運行的示例代碼嗎? – 2012-08-03 03:59:10

+0

添加了我的代碼。 – jbills 2012-08-03 04:21:30

回答

2

有一個完整的例子,只是你想要的。

Code Editor Example

翻譯到Python應該不是難事。

+0

你可以使用樣式表來設計它嗎?這是我的要求之一。 – jbills 2012-08-03 14:36:33