Как в стороне, минимальный пример может выглядеть следующим образом. Нельзя удалить одно заявление/оператор/выражение. Кнопка помогает визуализировать проблему, поэтому ее нужно оставить. Использование переменной триггера сбоя точно подсвечивает, какое условие вызывает ошибку: самодокументы кода, и вам почти не нужно описать повествование. Вопрос может быть столь же кратким, как приведенный ниже пример теста и одно предложение «Почему граница группового поля не видна, когда fail
истинна?». Скорее всего, если бы вы полностью следовали за минимизацией, вы бы поняли, в чем проблема - она становится довольно очевидной. Это не так, когда MyGroupBox
объявлен в другом файле!
Техник положить все это в единый main.cpp
файл критически в пятнистости проблемы: вся кода физически рядом друг с другом, что делает его гораздо легче обнаружить ошибки! Когда вы сворачиваете, обычно первыми вещами, которые должны быть, являются отдельные файлы: вставляйте все в один файл, а затем неустанно удаляйте абсолютно все, что непосредственно не нужно для воспроизведения проблемы.
#include <QtWidgets>
struct MyGroupBox : public QWidget {};
int main(int argc, char ** argv) {
bool fail = true;
QApplication app{argc, argv};
QWidget widget;
QVBoxLayout layout{&widget};
QGroupBox groupBox;
MyGroupBox myGroupBox;
QPushButton button;
layout.addWidget(fail ? static_cast<QWidget*>(&myGroupBox) : &groupBox);
layout.addWidget(&button);
widget.show();
return app.exec();
}
Этот краткий стиль предназначен не только для тривиальных тестовых примеров. В вашем реальном коде, заголовок и реализация по Widget
«s может выглядеть следующим образом:
// Widget.h
#include <QtWidgets>
#include "MyGroupBox.h"
class Widget : public QWidget {
Q_OBJECT
QVBoxLayout layout{this};
MyGroupBox groupBox;
QPushButton button{tr("Click Me!")};
public:
explicit Widget(QWidget * parent = nullptr);
};
// Widget.cpp
#include "Widget.h"
Widget::Widget(QWidget * parent) :
QWidget{parent} {
layout.addWidget(&groupBox);
layout.addWidget(&button);
}
Если вы настаиваете на экранирующей интерфейс от деталей реализации, не следует использовать указатели на виджеты и т.д., используйте PIMPL.
// Widget.h
#include <QWidget>
class WidgetPrivate;
class Widget : public QWidget {
Q_OBJECT
Q_DECLARE_PRIVATE(Widget)
QScopedPointer<WidgetPrivate> const d_ptr;
public:
explicit Widget(QWidget * parent = nullptr);
};
// Widget.cpp
#include "Widget.h" // should always come first!
#include "MyGroupBox.h"
class WidgetPrivate {
Q_DECLARE_PUBLIC(Widget)
Widget * const q_ptr;
public:
QVBoxLayout layout{q_func()};
QGroupBox groupBox;
MyGroupBox myGroupBox;
QPushButton button{"Click Me!"};
WidgetPrivate(Widget * q) : q_ptr(q) {
layout.addWidget(&groupBox);
layout.addWidget(&button);
}
};
Widget::Widget(QWidget * parent) :
QWidget{parent}, d_ptr{new WidgetPrivate{this}}
{}
Вы добавляете пустой виджет, так что ничего не видно. Если вы хотите доказать, что есть что-то там или нет, попробуйте наследовать от 'QFrame' и называть' setFrameStyle (QFrame :: Panel) 'на нем, чтобы вы получили границу, где виджет –
. Это помечено C++ 11, но это просто C++ 98 :(Qt + C++ 11 выглядит намного лучше и менее многословно! –
@KubaOber, пожалуйста, оцените мою вежливость C++ 11 в http: // stackoverflow.ком/вопросы/38130827/QUiLoader-виджет не-показывающие-, если загруженный-в-производного-QWidget. – KcFnMi