QLayout: Попытка добавить QLayout в QWidget, у которого уже есть макет

Я хочу создать несколько вкладок и прочитал этот ответ: Как добавить вкладку в PySide

Я использую код в ответе и внес некоторые изменения. Потому что мой код должен читать некоторые файлы и получать имена моих вкладок из этих файлов, поэтому я добавляю цикл for в свой код. И вот мой код.

from PySide import QtCore, QtGui
import sys
import dflash_controller as con

if __name__ == "__main__":
    list = [['a', 3], ['b', 4], ['c', 5], ['d', 6]]
    app = QtGui.QApplication(sys.argv)
    wid = QtGui.QWidget()
    grid = QtGui.QGridLayout(wid)
    wid.setLayout(grid)

    # setting the inner widget and layout
    grid_inner = QtGui.QGridLayout(wid)
    wid_inner = QtGui.QWidget(wid)
    wid_inner.setLayout(grid_inner)

    # add the inner widget to the outer layout
    grid.addWidget(wid_inner)

    # add tab frame to widget
    wid_inner.tab = QtGui.QTabWidget(wid_inner)
    grid_inner.addWidget(wid_inner.tab)

    # create tab


    for i, index in enumerate(list[0:]):
        new_tab = QtGui.QWidget(wid_inner.tab)
        grid_tab = QtGui.QGridLayout(new_tab)
        grid_tab.setSpacing(10)
        wid_inner.tab.addTab(new_tab, index[0])
        new_tab.setLayout(grid_tab)


    wid.show()
    app.exec_()

Это действительно показывает мои вкладки. Однако я встретил предупреждение: QLayout: Попытка добавить QLayout "" в QWidget "", у которого уже есть макет Поскольку этот код вкладки является лишь частью всего кода, проблема будет блокировать данные поток. И я понятия не имею, что с ним не так. Я искал ответы, но другие ответы не написаны на питоне.

Если кто-то может мне помочь, заранее спасибо.


person EricBkc    schedule 22.08.2014    source источник


Ответы (1)


Когда вы назначаете виджет родителем QLayout, передавая его в конструктор, макет автоматически устанавливается как макет для этого виджета. В вашем коде вы не только делаете это, но и явно вызываете setlayout(). Это не проблема, когда виджет передается один и тот же. Если они отличаются, вы получите сообщение об ошибке, потому что Qt попытается назначить второй макет вашему виджету, для которого уже был установлен макет.

Ваша проблема заключается в этих строках:

grid_inner = QtGui.QGridLayout(wid)
wid_inner = QtGui.QWidget(wid)

Здесь вы устанавливаете wid в качестве родителя для grid_inner. Qt хочет установить grid_inner в качестве макета для wid, но wid уже имеет макет, как указано выше. Изменение двух строк выше на это решит вашу проблему. Вы можете удалить звонки на setLayout(), так как они лишние.

wid_inner = QtGui.QWidget(wid)
grid_inner = QtGui.QGridLayout(wid_inner)

Используйте тот или иной метод для настройки макета, чтобы избежать путаницы.

Назначение виджета родительским:

widget = QtGui.QWidget()
layout = QGridLayout(widget)

Явная настройка макета:

widget = QtGui.QWidget()
layout = QGridLayout()
widget.setLayout(layout)
person user3419537    schedule 22.08.2014
comment
Спасибо. Я думаю, вы имеете в виду, что использование одного из этих двух способов может решить проблему. Но я пробовал оба, проблема все еще существует. У меня все еще что-то не так внутри? - person EricBkc; 22.08.2014
comment
Кстати, я заметил, что код в: Как добавить вкладку в питоне может работать отлично. Является ли источником проблемы часть цикла for, которую я изменил? - person EricBkc; 22.08.2014
comment
После второго взгляда я понял, что ваша проблема возникает из-за того, что вы создаете wid вместо wid_inner для grid_inner, который пытается переустановить макет для wid. Я исправил это, когда тестировал ваш код. Я обновил свой ответ соответственно. - person user3419537; 23.08.2014