كيفية تغيير محاذاة النص في QTABWidget؟
-
25-09-2019 - |
سؤال
لا يمكنني العثور على طريقة لتعيين محاذاة النص في QTABWidget.
بعد أن قمت بإنشاء مثيل لهذه القطعة ، قمت بتعيينها tabposition خاصية إلى الغرب ، لكنني أتمنى أن أظهر نصًا/تسمية أفقيًا. لقد ألقيت نظرة على QT's أوراق الأنماط, ، ولكن كما ترون ، محاذاة النص لا يمكن تعيين خاصية إلا على QPushbutton و QProgressBar.
لقد بحثت بالفعل على الويب ، لكنني وجدت للتو تقرير الشوائب, ، أ سؤال غير مجواب, ، وأخيرا مستخدم وهذا يشير إلى إعادة تنفيذ طريقة الطلاء (). ربما سأحل ، لكنني أستخدم Python (Pyqt أو Pyside) ولا أعرف كيفية القيام بذلك.
هل يمكنك مساعدتي؟
تحرير: شكرًا ل Teukamm ، كتبت القليل من التعليمات البرمجية:
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_())
وأخيرًا ، لقد تحاذي النص الخاص بي كما كنت أتوقع ، لكن لدي مشكلة صغيرة (كبيرة؟): عند النقر على الجانب الأيمن من كل زر علامة تبويب ، لا يرسل CurrentChanged الإشارة. لقد حاولت أيضًا توسيع عرض كل tabRect ، في Paintevent ، لكنه لا يعمل. ماذا علي أن أتغير؟
شكرًا لك :)
راجع للشغل: لا يمكنك أن ترث من qtabwidget ، ولكن من qtabbar ؛)
تعديل:
تم حلها! فقط غيرت الطريقة الحجم في TabSizeHint وهو يعمل بشكل جيد :)
المحلول
لتبدأ ، تحتاج إلى إنشاء فئة مخصصة هي فئة فرعية من QTGUI/QTABWIDGET وإعادة تعريف طريقة الطلاء:
class HorizontalTabWidget(QtGui.QTabWidget):
def paintEvent(self, event):
QPainter p;
p.begin(this);
# your drawing code goes here
p.end();
ها هي توثيق QWidget.paintevent طريقة أنك تتصرف.
بالطبع تحتاج إلى معرفة كيفية عمل الطلاء بشكل عام ، يرجى الرجوع إلى الوثائق qpainter.
لسوء الحظ ، ليس لدي تثبيت PYQT في متناول يدي في الوقت الحالي ، لذلك لا يمكنني أن أعطيك حلاً أكثر تحديدًا.
نصائح أخرى
لقد وضعت مثالًا يعمل معًا على Github يحل هذا هنا: https://gist.github.com/legostormtroopr/5075267
يتم نسخ الرمز عبر:
مثال الحد الأدنى.
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_())
الأصابع
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