强制Qt / PyQt / PySide QTabWidget调整大小到活动选项卡

时间:2015-02-25 02:17:35

标签: python qt pyqt pyside

我有一个QTabWidget正常工作,除了它没有重新调整我的预期。

小部件中有2个标签。每个都有一个带有小部件的QVBoxLayout。 VBox也按预期工作。

问题是第一个选项卡的布局比第二个选项卡有更多的小部件。查看第一个选项卡时,选项卡大小可以适当地包含其中的小部件。但是,在查看第二个选项卡时,选项卡窗口小部件与第一个选项卡保持相同的大小,而不是重新调整大小到可见的窗口小部件。

预计会出现这种情况吗?如果是这样,什么是好的工作?我希望标签窗口小部件始终缩放到当前活动的窗口小部件。

编辑: 这是一个问题的例子。 Tab B的所需行为是缩小到适当的大小,这可以通过注释掉下面的行来看出。

#!/bin/python
import sys
from PySide import QtGui, QtCore

class TabExample(QtGui.QWidget):
    def __init__(self):
        super(TabExample, self).__init__()
        self.initUI()

    def initUI(self):
        self.vbox_main = QtGui.QVBoxLayout()

        self.table_blank = QtGui.QTableWidget(10, 4)

        self.tabw = QtGui.QTabWidget()
        self.tab_A = QtGui.QWidget()
        self.vbox_A = QtGui.QVBoxLayout(self.tab_A)

        for i in range(20):
            lab = QtGui.QLabel('label %d' %i)
            self.vbox_A.addWidget(lab)

        self.tab_B = QtGui.QWidget()
        self.vbox_B = QtGui.QVBoxLayout(self.tab_B)

        for i in range(5):
            lab = QtGui.QLabel('labelB %d'%i)
            self.vbox_B.addWidget(lab)

        #COMMENT OUT NEXT LINE TO SEE DESIRED SIZE OF TAB B
        self.tabw.addTab(self.tab_A, 'Tab A')

        self.tabw.addTab(self.tab_B, 'Tab B')

        self.vbox_main.addWidget(self.table_blank, 1)
        self.vbox_main.addWidget(self.tabw)

        self.setLayout(self.vbox_main)
        self.setGeometry(0,0, 400, 600)
        self.move(QtGui.QDesktopWidget().availableGeometry().center() - self.frameGeometry().center())
        self.show()


def main():
    app = QtGui.QApplication(sys.argv)
    tabExample = TabExample()
    sys.exit(app.exec_())

if __name__ == "__main__":
    main()

1 个答案:

答案 0 :(得分:0)

这应该可以解决问题;根据哪个选项卡处于活动状态来更改大小策略。

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/ioport.h>
#include <linux/delay.h>

#define I8042_COMMAND_REG       0x64
#define I8042_STATUS_REG        0x64
#define I8042_DATA_REG          0x60

static inline int i8042_read_data(void)
{
        return inb(I8042_DATA_REG);
}

static inline int i8042_read_status(void)
{
        return inb(I8042_STATUS_REG);
}

static inline void i8042_write_data(int val)
{
        outb(val, I8042_DATA_REG);
}

static inline void i8042_write_command(int val)
{
        outb(val, I8042_COMMAND_REG);
}



int __init  hello_init(void)
{

    int status = i8042_read_status();
    int data;

    while (!(status & 0x02)) {
        status = i8042_read_status();
    }

    data = i8042_read_data();
    pr_info("Data:%02x\n", data);

    return 0;
}

void  __exit hello_exit(void)
{

}

MODULE_LICENSE("GPL");
module_init(hello_init);
module_exit(hello_exit);