2010-08-31 34 views
7

Tôi không thể tìm thấy cách để đặt căn chỉnh văn bản trong QTabWidget.Làm cách nào để thay đổi căn chỉnh văn bản trong QTabWidget?

Sau khi tôi đã tạo một phiên bản của tiện ích con này, tôi đã đặt thuộc tính tab tabPosition sang phương Tây, nhưng tôi muốn nó hiển thị văn bản/nhãn theo chiều ngang. Tôi đã xem qua số stylesheets của Qt, nhưng như bạn có thể thấy, thuộc tính văn bản của văn bản chỉ có thể được đặt trên QPushButton và QProgressBar.

Tôi đã tìm kiếm trên web nhưng tôi chỉ tìm thấy một số bugreport, một số non-answered question và cuối cùng là a user gợi ý triển khai lại phương thức paint(). Có lẽ tôi sẽ giải quyết, nhưng tôi đang sử dụng Python (PyQt hoặc PySide) và tôi không biết làm thế nào để làm điều đó.

Bạn có thể giúp tôi không?

EDIT: nhờ Teukamm, tôi đã viết một chút mã:

from PyQt4 import QtGui, QtCore 

class HorizontalTabWidget(QtGui.QTabBar): 
    def paintEvent(self, event): 
     for index in range(self.count()): 
      painter = QtGui.QPainter() 
      painter.begin(self) 
      painter.setPen(QtCore.Qt.blue); 
      painter.setFont(QtGui.QFont("Arial", 10)); 
      tabRect = self.tabRect(index) 
      painter.drawText(tabRect, QtCore.Qt.AlignVCenter | QtCore.Qt.TextDontClip, self.tabText(index)); 
      painter.end() 

    def sizeHint(self): 
     return QtCore.QSize(60, 130) 

import sys 
app = QtGui.QApplication(sys.argv) 
tabs = QtGui.QTabWidget() 
tabs.setTabBar(HorizontalTabWidget()) 
widget1 = QtGui.QWidget() 
widget2 = QtGui.QWidget() 
tabs.addTab(widget1, "Widget1") 
tabs.addTab(widget2, "Widget2") 
tabs.setTabPosition(2) 
tabs.show() 
sys.exit(app.exec_()) 

Và cuối cùng tôi đã liên kết văn bản của tôi như tôi mong đợi, nhưng con có một chút (lớn?) Vấn đề: khi bạn bấm vào bên phải của mỗi nút tab, nó không gửi currentChanged SIGNAL. Tôi cũng đã cố gắng mở rộng chiều rộng của mỗi tabRect, trong paintEvent, nhưng nó không hoạt động. Tôi nên thay đổi điều gì?

Cảm ơn bạn :)

BTW: bạn không thể kế thừa từ QTabWidget, nhưng từ QTabBar;)

EDIT:

Giải Quyết! Chỉ cần thay đổi phương pháp sizeHint trong tabSizeHint và nó hoạt động tốt :)

+0

bạn không thể ghi đè phương pháp vẽ trong puQt? – Naruto

+0

Có, tôi muốn ghi đè phương thức đó, nhưng tôi nghĩ rằng nó không được bao gồm trong việc thực hiện Python (không biết chính xác lý do tại sao tôi cho rằng điều này ...) Cảm ơn bạn đã bình luận của bạn :) – Markon

Trả lời

1

Để giúp bạn bắt đầu, bạn cần phải tạo ra một lớp tùy chỉnh mà là một lớp con của QtGui/QTabWidget và xác định lại phương pháp sơn:

class HorizontalTabWidget(QtGui.QTabWidget): 
    def paintEvent(self, event): 
     QPainter p; 
     p.begin(this); 
     # your drawing code goes here 
     p.end(); 

Đây là phương pháp documentation for QWidget.paintEvent mà bạn đang thực hiện lại.

Tất nhiên bạn cần biết cách hoạt động của bức tranh nói chung, vui lòng tham khảo tài liệu cho QPainter.

Rất tiếc, hiện tại tôi chưa cài đặt PyQt, vì vậy tôi không thể cung cấp cho bạn giải pháp cụ thể hơn.

+0

Tôi quên bạn có thể cần phải reimplement sizeHint() là tốt. – teukkam

+0

Cảm ơn bạn rất nhiều! Tuy nhiên, tôi đã chỉnh sửa câu hỏi. Có lẽ bạn có thể giúp tôi :) – Markon

7

Tôi đã đặt một ví dụ làm việc với nhau trên GitHub rằng giải quyết này ở đây: https://gist.github.com/LegoStormtroopr/5075267

Mã này được sao chép qua cũng như:

Minimal example.py:

from PyQt4 import QtGui, QtCore 
from FingerTabs import FingerTabWidget 

import sys 

app = QtGui.QApplication(sys.argv) 
tabs = QtGui.QTabWidget() 
tabs.setTabBar(FingerTabWidget(width=100,height=25)) 
digits = ['Thumb','Pointer','Rude','Ring','Pinky'] 
for i,d in enumerate(digits): 
    widget = QtGui.QLabel("Area #%s <br> %s Finger"% (i,d)) 
    tabs.addTab(widget, d) 
tabs.setTabPosition(QtGui.QTabWidget.West) 
tabs.show() 
sys.exit(app.exec_()) 

FingerTabs. py:

from PyQt4 import QtGui, QtCore 

class FingerTabWidget(QtGui.QTabBar): 
    def __init__(self, *args, **kwargs): 
     self.tabSize = QtCore.QSize(kwargs.pop('width'), kwargs.pop('height')) 
     super(FingerTabWidget, self).__init__(*args, **kwargs) 

    def paintEvent(self, event): 
     painter = QtGui.QStylePainter(self) 
     option = QtGui.QStyleOptionTab() 

     for index in range(self.count()): 
      self.initStyleOption(option, index) 
      tabRect = self.tabRect(index) 
      tabRect.moveLeft(10) 
      painter.drawControl(QtGui.QStyle.CE_TabBarTabShape, option) 
      painter.drawText(tabRect, QtCore.Qt.AlignVCenter |\ 
          QtCore.Qt.TextDontClip, \ 
          self.tabText(index)); 

    def tabSizeHint(self,index): 
     return self.tabSize 
Các vấn đề liên quan