Skip to content

Instantly share code, notes, and snippets.

@herronelou
Created November 11, 2024 23:12
Show Gist options
  • Save herronelou/445668948fdef9d2c6e86f2c80dfd68a to your computer and use it in GitHub Desktop.
Save herronelou/445668948fdef9d2c6e86f2c80dfd68a to your computer and use it in GitHub Desktop.
Partial example for custom Qt Widget in Nuke
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