Created
November 11, 2024 23:12
-
-
Save herronelou/445668948fdef9d2c6e86f2c80dfd68a to your computer and use it in GitHub Desktop.
Partial example for custom Qt Widget in Nuke
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
MyWidget::MyWidget(MyKnob* knob) : _knob(knob), _value(knob->_data), _dragging(false) | |
{ | |
setFixedSize(60, 30); | |
_switchRect = rect(); | |
_knob->addCallback(WidgetCallback, this); | |
} | |
MyWidget::~MyWidget() | |
{ | |
if (_knob) | |
_knob->removeCallback(WidgetCallback, this); | |
} | |
void MyWidget::paintEvent(QPaintEvent* event) | |
{ | |
QPainter painter(this); | |
painter.setRenderHint(QPainter::Antialiasing); | |
// Draw background | |
painter.setPen(Qt::NoPen); | |
painter.setBrush(_value ? QColor(0, 150, 136) : QColor(120, 120, 120)); | |
painter.drawRoundedRect(_switchRect, 15, 15); | |
// Draw switch | |
painter.setBrush(Qt::white); | |
int position = _value ? width() - 28 : 2; | |
painter.drawEllipse(position, 2, 26, 26); | |
} | |
void MyWidget::mousePressEvent(QMouseEvent* event) | |
{ | |
if (event->button() == Qt::LeftButton) | |
{ | |
_dragging = true; | |
event->accept(); | |
} | |
} | |
void MyWidget::mouseMoveEvent(QMouseEvent* event) | |
{ | |
if (_dragging) | |
{ | |
bool newValue = event->pos().x() > width() / 2; | |
if (newValue != _value) | |
{ | |
_value = newValue; | |
_knob->setValue(_value); | |
update(); | |
} | |
event->accept(); | |
} | |
} | |
void MyWidget::mouseReleaseEvent(QMouseEvent* event) | |
{ | |
if (event->button() == Qt::LeftButton) | |
{ | |
_dragging = false; | |
bool newValue = event->pos().x() > width() / 2; | |
_value = newValue; | |
_knob->setValue(_value); | |
update(); | |
event->accept(); | |
} | |
} | |
void MyWidget::update() | |
{ | |
_value = _knob->_data; | |
QWidget::update(); | |
} | |
void MyWidget::destroy() | |
{ | |
_knob = 0; | |
} | |
int MyWidget::WidgetCallback(void* closure, Knob::CallbackReason reason) | |
{ | |
MyWidget* widget = (MyWidget*)closure; | |
assert(widget); | |
switch (reason) { | |
case Knob::kIsVisible: | |
{ | |
for (QWidget* w = widget->parentWidget(); w; w = w->parentWidget()) | |
if (qobject_cast<QTabWidget*>(w)) | |
return widget->isVisibleTo(w); | |
return widget->isVisible(); | |
} | |
case Knob::kUpdateWidgets: | |
widget->update(); | |
return 0; | |
case Knob::kDestroying: | |
widget->destroy(); | |
return 0; | |
default: | |
return 0; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment