cpp widget QT Designer?
: . Qt Designer Xyz.ui, XML . uic .ui ui_Xyz.h. : , , .
, . - (, QProgressBar) , setupUi . , .
.ui . , . , , :
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Form</class>
<widget class="QWidget" name="Form">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>256</width>
<height>40</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QProgressBar" name="placeholder">
<property name="value">
<number>24</number>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>
progressBar, XML. :
<widget class="MyProgressBar" name="placeholder">
<property name="value">
<number>24</number>
</property>
</widget>
<customwidgets>:
<customwidgets>
<customwidget>
<class>MyProgressBar</class>
<extends>QProgressBar</extends>
<header>myprogressbar.h</header>
</customwidget>
</customwidgets>
, , .ui , .
:
?
, . , : , (MyProgressBar) .ui.
class MyProgressBar : public QProgressBar {
int m_var;
protected:
void paintEvent(QPaintEvent * ev) {
QProgressBar::paintEvent(event(ev));
QPainter p(this);
}
public:
void doSomething() {
m_var = 3;
}
};
void doSomething(QProgressBar * bar) {
bar.setProperty("m_var", 3);
}
void paintEvent(QWidget * w, QPaintEvent * ev) {
w->event(ev);
QPainter p(w);
}
struct Painter : public QObject {
bool eventFilter(QObject * obj, QEvent * ev) {
if (obj->isWidgetType() && ev->type() == QEvent::Paint)
paintEvent(static_cast<QWidget*>(obj), static_cast<QPaintEvent*>(ev));
return QObject::eventFilter(obj, ev);
}
}
QProgressBar bar;
bar.installEventFilter(new Painter(&bar));
.
// . .
class Form : public QWidget, private Ui::Form {
MyProgressBar m_bar;
...
}
.
void replace(QWidget * & old, QWidget * replacement) {
auto layout = old->parent()->layout();
replacement->setObjectName(old->objectName());
delete layout->replaceWidget(old, replacement);
delete old;
old = nullptr;
}
Form:: Form(QWidget * parent) :
QWidget(parent)
{
setupUi(this);
replace(placeholder, &m_bar);
}