Python pyqt qtabwidget水平选项卡和QtDesigner中的水平文本
我在使用pyqt4设计更改文本对齐方式时遇到问题我通过向西对齐使制表符水平,但是从北向南的文本看起来很糟糕我想将文本对齐方式更改为水平,我如何才能做到这一点…提前感谢 这是我的ui.py代码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
# 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>
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())