Add “custom-widgets” example
This small example demonstrates defining and binding to your own subclass of a QT widget.
This commit is contained in:
parent
890c20ca77
commit
1704d392e8
|
@ -0,0 +1,13 @@
|
|||
# “Goodbye” example
|
||||
|
||||
This is a bare-minimum example egg that shows how one can define their own
|
||||
custom QT widgets and bind to their methods in a way compatible with qt-light.
|
||||
|
||||
It defines an `OurButton` C++ class that is derived from
|
||||
[`QPushButton`](https://doc.qt.io/qt-6/qpushbutton.html) with one change:
|
||||
It adds a `SayGoodbye()` method that changes the button’s label to “Goodbye”.
|
||||
|
||||
We write a wrapper C-function `gb_saygoodbye()` and bind this function into
|
||||
our `goodbye-widgets` module under the name `gb:saygoodbye`. It is run on the
|
||||
button (originally labelled “Quit” in the `goodbye.ui` file), so changing its
|
||||
text to “Goodbye”.
|
|
@ -0,0 +1,8 @@
|
|||
#include <QPushButton>
|
||||
|
||||
class OurButton : public QPushButton {
|
||||
public:
|
||||
OurButton(QWidget* parent);
|
||||
|
||||
void SayGoodbye();
|
||||
};
|
|
@ -0,0 +1,43 @@
|
|||
;;;; qt-light.scm
|
||||
|
||||
|
||||
(module goodbye-widgets (gb:saygoodbye)
|
||||
|
||||
(import
|
||||
scheme
|
||||
(chicken base)
|
||||
(chicken bitwise)
|
||||
(chicken foreign)
|
||||
(chicken format)
|
||||
(chicken fixnum)
|
||||
(chicken string)
|
||||
bind
|
||||
miscmacros
|
||||
qt-light
|
||||
srfi-4 srfi-1 protobj matchable
|
||||
)
|
||||
|
||||
|
||||
(define <gb-button> (% <qt-widget> (class 'gb-button)))
|
||||
|
||||
(define (qt:->pointer i) (and i (? i pointer)))
|
||||
(define (qt:pointer->button p) (and p (% <gb-button> (pointer p))))
|
||||
|
||||
(bind-rename/pattern "gb_" "gb:")
|
||||
(bind-type gbbutton c-pointer gb:->pointer gb:pointer->button)
|
||||
|
||||
#>
|
||||
#define ___safe
|
||||
#define ___bool int
|
||||
#define ___out
|
||||
<#
|
||||
|
||||
#>
|
||||
extern "C" {
|
||||
#include "prototypes.h"
|
||||
}
|
||||
<#
|
||||
|
||||
(bind-file* "prototypes.h")
|
||||
|
||||
)
|
|
@ -0,0 +1,13 @@
|
|||
((synopsis "An example program that uses a subclassed QT widget.")
|
||||
(category ui)
|
||||
(license "BSD")
|
||||
(dependencies bind protobj qt-light matchable miscmacros shell)
|
||||
(author "Jaidyn Ann")
|
||||
(components
|
||||
(extension
|
||||
goodbye-widgets
|
||||
(custom-build "../../chicken-compile-qt-extension.scm")
|
||||
(csc-options ;
|
||||
"-O3" "-d1" "-X" "bind" "-s" "-k" "-emit-link-file" "goodbye-widgets.link" "-o" "goodbye-widgets.o")
|
||||
)
|
||||
(program goodbye)))
|
|
@ -0,0 +1,12 @@
|
|||
(import qt-light goodbye-widgets protobj
|
||||
(chicken io))
|
||||
|
||||
(define a (qt:init))
|
||||
(define w (qt:widget (call-with-input-file "goodbye.ui" (lambda (p) (read-string #f p)))))
|
||||
(print (? w pointer))
|
||||
(define b (qt:find w "goodbyeButton"))
|
||||
(print b)
|
||||
(qt:connect b "clicked()" a "quit()")
|
||||
(qt:show w)
|
||||
(gb:saygoodbye b)
|
||||
(qt:run)
|
|
@ -0,0 +1,61 @@
|
|||
<?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>295</width>
|
||||
<height>144</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string/>
|
||||
</property>
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>40</x>
|
||||
<y>30</y>
|
||||
<width>201</width>
|
||||
<height>31</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<pointsize>15</pointsize>
|
||||
<bold>true</bold>
|
||||
</font>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Adieu, monsieur!</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="OurButton" name="goodbyeButton">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>180</x>
|
||||
<y>90</y>
|
||||
<width>75</width>
|
||||
<height>31</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Quit</string>
|
||||
</property>
|
||||
</widget>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>OurButton</class>
|
||||
<extends>QPushButton</extends>
|
||||
<header>custom_widget.h</header>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
|
@ -0,0 +1,29 @@
|
|||
#include "goodbye-widgets.h"
|
||||
|
||||
#define gbbutton OurButton *
|
||||
|
||||
OurButton::OurButton(QWidget* parent)
|
||||
: QPushButton(parent)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
OurButton::SayGoodbye()
|
||||
{
|
||||
setText("Goodbye");
|
||||
}
|
||||
|
||||
|
||||
#define cwbutton OurButton *
|
||||
|
||||
extern "C" {
|
||||
#include "prototypes.h"
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
gb_saygoodbye(cwbutton button)
|
||||
{
|
||||
button->SayGoodbye();
|
||||
}
|
|
@ -0,0 +1,4 @@
|
|||
/* prototypes.h */
|
||||
|
||||
|
||||
void gb_saygoodbye(gbbutton button);
|
Ŝarĝante…
Reference in New Issue