如何使一个小部件附加到QTabWidget的间隙,并在pyqt5中使用QSplitter进行相应的移动

时间:2017-12-16 14:48:46

标签: python pyqt pyqt5 qtabwidget qsplitter

我想让按钮始终位于第二个标签的标签旁边,即使我使用拆分器在两个标签之间移动边缘也是如此。怎么实现呢?我相信这是因为我使用了绝对位置,但是如何在QTabWidget的空白中附加一个小部件?

from PyQt5.QtWidgets import (QWidget, QHBoxLayout, QFrame, 
    QSplitter, QStyleFactory, QApplication,QTabWidget,QPushButton)
from PyQt5.QtCore import Qt
import sys

class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()


    def initUI(self):
        hbox = QHBoxLayout(self)

        tab1 = QTabWidget(self)
        tab2 = QTabWidget(self)


        a=QWidget()
        a.setGeometry(0,0, 40, 40)
        tab2.addTab(a,"2")

        splitter1 = QSplitter(Qt.Vertical)
        splitter1.addWidget(tab1)
        splitter1.addWidget(tab2)
        splitter1.setSizes([100,100])
        hbox.addWidget(splitter1)
        self.setLayout(hbox)

        z=QPushButton(self)
        z.setGeometry(100,100,70,20)
        z.setText("button")
        self.setGeometry(300, 300, 300, 200)
        self.show()


if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

这就是我想要一直实现的目标。

This is what I want to achieve all the time

这是我在两个标签之间调整边缘时发生的情况。

This is what happened when I adjust the edge between two tabs

1 个答案:

答案 0 :(得分:1)

向窗口小部件添加父窗口时,窗口小部件具有相对于父窗口的坐标系,因此您必须更改父窗口。除了将按钮的位置调整为相对于父按钮的位置:

[...]
z=QPushButton(tab2)
z.setGeometry(100,0,70,20)
z.setText("button")
[...]

另一个系列改进,即使QtabWidget的大小发生变化,按钮仍保持居中:

class TabWidgetWithButton(QTabWidget):
    def __init__(self, *args, **kwargs):
        QTabWidget.__init__(self, *args, **kwargs)
        self.button = QPushButton("button", self)

    def resizeEvent(self, event):
        self.button.move((self.width()-self.button.width())/2, 0)
        QTabWidget.resizeEvent(self, event)

class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        hbox = QHBoxLayout(self)
        tab1 = QTabWidget(self)
        tab2 = TabWidgetWithButton(self)

        a=QWidget(self)
        tab2.addTab(a,"2")
        splitter1 = QSplitter(Qt.Vertical)
        splitter1.addWidget(tab1)
        splitter1.addWidget(tab2)
        splitter1.setSizes([100,100])
        hbox.addWidget(splitter1)
        self.setLayout(hbox)
        self.setGeometry(300, 300, 300, 200)
        self.show()


if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())