Python pyqt qtabwidget水平选项卡和QtDesigner中的水平文本

Python pyqt qtabwidget水平选项卡和QtDesigner中的水平文本,python,python-3.x,pyqt,pyqt4,qt-designer,Python,Python 3.x,Pyqt,Pyqt4,Qt Designer,我在使用pyqt4设计更改文本对齐方式时遇到问题我通过向西对齐使制表符水平,但是从北向南的文本看起来很糟糕我想将文本对齐方式更改为水平,我如何才能做到这一点…提前感谢 这是我的ui.py代码 # Form implementation generated from reading ui file 'untitled.ui' # # Created by: PyQt4 UI code generator 4.11.4 # # WARNING! All changes made in this fi

我在使用pyqt4设计更改文本对齐方式时遇到问题我通过向西对齐使制表符水平,但是从北向南的文本看起来很糟糕我想将文本对齐方式更改为水平,我如何才能做到这一点…提前感谢

这是我的ui.py代码

# Form implementation generated from reading ui file 'untitled.ui'
#
# Created by: PyQt4 UI code generator 4.11.4
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.resize(800, 600)
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
        self.gridLayout = QtGui.QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
        self.tabWidget = QtGui.QTabWidget(self.centralwidget)
        self.tabWidget.setTabPosition(QtGui.QTabWidget.West)
        self.tabWidget.setObjectName(_fromUtf8("tabWidget"))
        self.tab = QtGui.QWidget()
        self.tab.setObjectName(_fromUtf8("tab"))
        self.tabWidget.addTab(self.tab, _fromUtf8(""))
        self.tab_2 = QtGui.QWidget()
        self.tab_2.setObjectName(_fromUtf8("tab_2"))
        self.tabWidget.addTab(self.tab_2, _fromUtf8(""))
        self.tab_3 = QtGui.QWidget()
        self.tab_3.setObjectName(_fromUtf8("tab_3"))
        self.tabWidget.addTab(self.tab_3, _fromUtf8(""))
        self.gridLayout.addWidget(self.tabWidget, 0, 0, 1, 1)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtGui.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 31))
        self.menubar.setObjectName(_fromUtf8("menubar"))
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtGui.QStatusBar(MainWindow)
        self.statusbar.setObjectName(_fromUtf8("statusbar"))
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        self.tabWidget.setCurrentIndex(0)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "Tab 1", None))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "Tab 2", None))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_3), _translate("MainWindow", "Page", None))


if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    MainWindow = QtGui.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())
这是我的主文件,我将在其中添加所有函数,并从这里生成我的窗口

from untitled import *
from PyQt4 import QtGui # Import the PyQt4 module we'll need
import sys # We need sys so that we can pass argv to QApplication
import os

from PyQt4.QtGui import *
from PyQt4.QtCore import *


class MainWindow(QMainWindow,Ui_MainWindow):
    def __init__(self, parent=None):
        QMainWindow.__init__(self, parent)
        self.setupUi(self)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

我提出的解决方案可能不是确切的解决方案,但我认为这是最接近的解决方案。我建议将
QTabWidget
升级为使用自定义
QTabWidget

在此之前,我已经改进了本文中提出的解决方案:

tabwidget.py

from PyQt4 import QtGui, QtCore


class HorizontalTabBar(QtGui.QTabBar):
    def paintEvent(self, event):
        painter = QtGui.QStylePainter(self)
        option = QtGui.QStyleOptionTab()
        for index in range(self.count()):
            self.initStyleOption(option, index)
            painter.drawControl(QtGui.QStyle.CE_TabBarTabShape, option)
            painter.drawText(self.tabRect(index),
                             QtCore.Qt.AlignCenter | QtCore.Qt.TextDontClip,
                             self.tabText(index))

    def tabSizeHint(self, index):
        size = QtGui.QTabBar.tabSizeHint(self, index)
        if size.width() < size.height():
            size.transpose()
        return size


class TabWidget(QtGui.QTabWidget):
    def __init__(self, parent=None):
        QtGui.QTabWidget.__init__(self, parent)
        self.setTabBar(HorizontalTabBar())
在使用前面的结构之后,我们使用Qt Designer打开.ui文件,右键单击
QTabWidget
,然后选择升级为…

将打开一个对话,对话中应放置以下内容:

然后按
add
按钮,然后按
promote
按钮,最后在
pyuic
的帮助下再次生成.py文件

最后,您将获得以下小部件:


使用上述方法,然后添加一行代码,显示我的图标

from PyQt4 import QtGui, QtCore


class HorizontalTabBar(QtGui.QTabBar):
    def paintEvent(self, event):
        painter = QtGui.QStylePainter(self)
        option = QtGui.QStyleOptionTab()
        for index in range(self.count()):
            self.initStyleOption(option, index)
            painter.drawControl(QtGui.QStyle.CE_TabBarTabShape, option)
            painter.drawText(self.tabRect(index),
                             QtCore.Qt.AlignCenter | QtCore.Qt.TextDontClip,
                             self.tabText(index))
            if index == 0:
                painter.drawImage(QtCore.QRectF(10, 10, 66, 67), QtGui.QImage("ico/HOME.png"))

    def tabSizeHint(self, index):
        size = QtGui.QTabBar.tabSizeHint(self, index)
        size.setHeight=50
        size.setWidth=200
        if size.width() < size.height():
            size.transpose()
        return size


class TabWidget(QtGui.QTabWidget):
    def __init__(self, parent=None):
        QtGui.QTabWidget.__init__(self, parent)
        self.setTabBar(HorizontalTabBar())
从PyQt4导入QtGui,QtCore
类HorizontalTabBar(QtGui.QTabBar):
def paintEvent(自身,事件):
painter=QtGui.QStylePainter(self)
option=QtGui.QStyleOptionTab()
对于范围内的索引(self.count()):
self.initStyleOption(选项,索引)
painter.drawControl(QtGui.QStyle.CE_tabbartababshape,选项)
painter.drawText(self.tabRect(索引),
QtCore.Qt.AlignCenter | QtCore.Qt.TextDontClip,
self.tabText(索引))
如果索引==0:
painter.drawImage(QtCore.QRectF(10,10,66,67),QtGui.QImage(“ico/HOME.png”))
def tabSizeHint(自身,索引):
size=QtGui.QTabBar.tabSizeHint(self,index)
size.setHeight=50
size.setWidth=200
如果size.width()

您可以根据选项卡的索引添加图标,并相应地设置它们的位置,到目前为止,这是我能提供的最佳解决方案。干杯

外观和可用性的更好方式:

在Qt Designer>

  • 在左侧使用QToolBox,在右侧使用QTabWidget
  • 用信号连接两者(currentChanged(int)-setCurrentIndex(int))
  • 使用以下css隐藏QTabWidget头
  • QTabBar::tab{height:0px;}

    这里有一个例子:


    我知道这已经有一段时间了,但是如果有人需要@Sahil Jain在PyQt5版本中的答案,请参考下面的tabwidget.py

    从PyQt5导入QtGui、QtCore、qtwidget
    类HorizontalTabBar(qtwidts.QTabBar):
    def paintEvent(自身,事件):
    painter=qtwidts.QStylePainter(self)
    option=qtwidts.QStyleOptionTab()
    对于范围内的索引(self.count()):
    self.initStyleOption(选项,索引)
    painter.drawControl(qtwidts.QStyle.CE_tabbartababshape,选项)
    painter.drawText(self.tabRect(索引),
    QtCore.Qt.AlignCenter | QtCore.Qt.TextDontClip,
    self.tabText(索引))
    def tabSizeHint(自身,索引):
    size=qtwidts.QTabBar.tabSizeHint(self,index)
    如果size.width()
    您可以显示您得到的和想要得到的图像:P@eyllanesc我得到这个显示,我想在标签中的文字是水平的too@ekhumoro你们有并没有看到painter在那个问题中解释说guy已经实现了文本,只是painter语法有问题,这里的开始是sratch@CodingHub. 该模型有一个完全有效的示例。我试过了,效果很好。您只需要
    FingerTabWidget
    类。在代码中,只需执行self.tabWidget.setTabBar(FingerTabWidget(宽度=100,高度=25))
    。(请随意调整宽度和高度)。@EKHUROMO这会使选项卡不可见,我已经按照您所说的更新了代码。您知道如何在移除图标时向其添加图标吗?以及如何通过为选项卡提供自定义大小来更改选项卡的大小own@SahilJain. 这与我最初给您的解决方案基本相同,因此它仍然有相同的局限性。@ekhumoro关于如何构建小部件的解决方案是相同的,我的回答主要是为了指导您,如果您想在Qt中应用,Designer应该通过提升小部件来实现。@eyllanesc。这不是对您的答案的批评-我只是指出,来自的代码不是一个完整的解决方案。这就是我决定重新提出这个问题的原因。使用OPs示例使用现有的tab bar类并不能解决所有问题(例如,渲染图标)。
    from PyQt4 import QtGui, QtCore
    
    
    class HorizontalTabBar(QtGui.QTabBar):
        def paintEvent(self, event):
            painter = QtGui.QStylePainter(self)
            option = QtGui.QStyleOptionTab()
            for index in range(self.count()):
                self.initStyleOption(option, index)
                painter.drawControl(QtGui.QStyle.CE_TabBarTabShape, option)
                painter.drawText(self.tabRect(index),
                                 QtCore.Qt.AlignCenter | QtCore.Qt.TextDontClip,
                                 self.tabText(index))
                if index == 0:
                    painter.drawImage(QtCore.QRectF(10, 10, 66, 67), QtGui.QImage("ico/HOME.png"))
    
        def tabSizeHint(self, index):
            size = QtGui.QTabBar.tabSizeHint(self, index)
            size.setHeight=50
            size.setWidth=200
            if size.width() < size.height():
                size.transpose()
            return size
    
    
    class TabWidget(QtGui.QTabWidget):
        def __init__(self, parent=None):
            QtGui.QTabWidget.__init__(self, parent)
            self.setTabBar(HorizontalTabBar())