По сути, мне нужен такой макет:

Виджет 4 создается последним и должен идти рядом с виджетами с вкладками 2 & 3. Однако его вставка приводит к исчезновению самого виджета и другого виджета:

Вот код, создающий второй снимок экрана:
В конструкторе главного окна (или дочерних элементов mdi, это не имеет особого значения) я делаю следующее:
Код: Выделить всё
QDockWidgetTest::QDockWidgetTest(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
setCentralWidget(0); // only QDockWidgets
QWidget* testWidget1 = new TestWidget("1", QColor("red"));
QWidget* testWidget2 = new TestWidget("2", QColor("green"));
QWidget* testWidget3 = new TestWidget("3", QColor("blue"));
QWidget* testWidget4 = new TestWidget("4", QColor("yellow"));
DockWidgetWrapper* testQWidget1 = new DockWidgetWrapper(testWidget1, "Test Widget 1", "TestWidget1");
DockWidgetWrapper* testQWidget2 = new DockWidgetWrapper(testWidget2, "Test Widget 2", "TestWidget2");
DockWidgetWrapper* testQWidget3 = new DockWidgetWrapper(testWidget3, "Test Widget 3", "TestWidget3");
DockWidgetWrapper* testQWidget4 = new DockWidgetWrapper(testWidget4, "Test Widget 4", "TestWidget4");
addDockWidget(Qt::LeftDockWidgetArea, testQWidget1);
splitDockWidget(testQWidget1, testQWidget2, Qt::Vertical);
tabifyDockWidget(testQWidget2, testQWidget3);
splitDockWidget(testQWidget3, testQWidget4, Qt::Horizontal);
}
Код: Выделить всё
#include
#include
#include
#include
class TestWidget: public QWidget
{
private:
QString m_content;
QColor m_fillColor;
public:
TestWidget(QString content, QColor color):
m_content(content),
m_fillColor(color)
{
m_fillColor.setAlpha(50);
}
protected:
void paintEvent(QPaintEvent* e)
{
QPainter p(this);
QFontMetrics fm(p.font());
QRect g(geometry());
p.fillRect(g, m_fillColor);
p.drawText(g.width()/2 - fm.width(m_content), g.height()/2 + fm.height(), m_content);
}
};
Код: Выделить всё
#include
#include
class DockWidgetWrapper: public QDockWidget
{
public:
DockWidgetWrapper(QWidget* widget, QString const & windowTitle, QString const & objectName)
{
setWindowTitle(windowTitle);
setFeatures(DockWidgetClosable | DockWidgetMovable | DockWidgetFloatable);
setWidget(widget);
setObjectName(objectName);
}
};
Код: Выделить всё
testWidget3
Так что есть пустая область, где Предполагается, что testWidget3 и testWidget4 (судя по контекстному меню, у Qt сложилось впечатление, что они все еще отображаются!). Только при отключении этих двух пустая область под testWidget1 исчезает.
Если я сначала разделяю, а затем табулирую, все в порядке. Проблема в том, что я хотел бы выполнить табуляцию в общей части программного обеспечения, а затем разделить ее, когда я загружаю специализированную часть. Так что переупорядочение этих двух вариантов для меня не вариант. В документации я смог найти только следующее:
Примечание: если первая в данный момент находится в закрепленной области с вкладками, вторая будет добавлена как новая вкладка, а не как сосед первой. Это связано с тем, что одна вкладка может содержать только один виджет закрепления.
Это определенно не то, что происходит. И кроме того, это описание оставляет желать лучшего: в моем примере это означает, что после того, как я добавил вкладки testWidget2 и testWidget3, нет возможности (программно) расположить виджет testWidget4 справа от них, или есть другой способ добиться этого?
У меня эта проблема постоянно возникает с Qt 4.8 и 5.3. Я полагаю, это может быть ошибка в Qt? Это известная ошибка (мой поиск пока не дал результатов)? Или есть какое-то другое разумное объяснение этому или способ «вернуть» два потерянных виджета?
Подробнее здесь: https://stackoverflow.com/questions/281 ... havior-bug
Мобильная версия