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

How to make a widget attached to QTabWidget's gap and move accordingly with QSplitter in pyqt5

我想让按钮始终位于第二个选项卡的标签旁边,即使我使用拆分器在两个选项卡之间移动边缘也是如此。如何实现?我相信这是因为我使用了绝对位置,但是如何在 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_())

这是我一直想达到的目标。

这是我调整两个选项卡之间的边缘时发生的情况。

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

[...]
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_())