QDockWidget tabify/splitDockWidget странное поведение/ошибка?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 QDockWidget tabify/splitDockWidget странное поведение/ошибка?

Сообщение Anonymous »

У меня есть приложение с MdiChilds, которое должно содержать несколько QDockWidgets. Однако у меня возникают проблемы с разделением/вкладыванием виджетов, чтобы они создавали желаемый макет по умолчанию.
По сути, мне нужен такой макет:
Изображение

Виджет 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);
}
где TestWidget — это простой класс, производный от QWidget, который просто рисует себя в заданный цвет и заголовок посередине:

Код: Выделить всё

#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);
}
};
и DockWidgetWrapper — это простая оболочка QDockWidget для любого QWidget:

Код: Выделить всё

#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
и testWidget4 полностью исчезли после последнего вызова SplitDockWidget, поэтому вызов SplitDockWidget для виджета с вкладками приводит к исчезновению как вставляемого, так и виджета с вкладками. Если я вызову контекстное меню в заголовке QDockWidget и заставлю testWidget2 исчезнуть через него, приложение будет выглядеть еще более странно:
Изображение

Так что есть пустая область, где Предполагается, что testWidget3 и testWidget4 (судя по контекстному меню, у Qt сложилось впечатление, что они все еще отображаются!). Только при отключении этих двух пустая область под testWidget1 исчезает.
Если я сначала разделяю, а затем табулирую, все в порядке. Проблема в том, что я хотел бы выполнить табуляцию в общей части программного обеспечения, а затем разделить ее, когда я загружаю специализированную часть. Так что переупорядочение этих двух вариантов для меня не вариант. В документации я смог найти только следующее:

Примечание: если первая в данный момент находится в закрепленной области с вкладками, вторая будет добавлена ​​как новая вкладка, а не как сосед первой. Это связано с тем, что одна вкладка может содержать только один виджет закрепления.

Это определенно не то, что происходит. И кроме того, это описание оставляет желать лучшего: в моем примере это означает, что после того, как я добавил вкладки testWidget2 и testWidget3, нет возможности (программно) расположить виджет testWidget4 справа от них, или есть другой способ добиться этого?
У меня эта проблема постоянно возникает с Qt 4.8 и 5.3. Я полагаю, это может быть ошибка в Qt? Это известная ошибка (мой поиск пока не дал результатов)? Или есть какое-то другое разумное объяснение этому или способ «вернуть» два потерянных виджета?

Подробнее здесь: https://stackoverflow.com/questions/281 ... havior-bug
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»