diff --git a/internal/examples/common/qml/buttons.go b/internal/examples/common/qml/buttons.go new file mode 100644 index 00000000..b01363c6 --- /dev/null +++ b/internal/examples/common/qml/buttons.go @@ -0,0 +1,90 @@ +package main + +func buttons() { + + //Push Button + createWidget("Push Button", ` + Item { + Button { + anchors.centerIn: parent + text: "Push Button" + onClicked: console.log("You Clicked The Push Button") + } + } +`) + + //Tool Button (+ ToolBar) + createWidget("Tool Button", ` + Item { + ToolBar { + RowLayout { + anchors.fill: parent + + ToolButton { + Layout.fillHeight: true + text: "Tool Button" + onClicked: console.log("You Clicked The Tool Button") + } + } + } + } +`) + + //Radio Button + createWidget("Radio Button", ` + Item { + ColumnLayout { + anchors.fill: parent + + ExclusiveGroup { id: radioGroup } + + RadioButton { + text: "Radio Button 0" + onClicked: console.log("You Clicked The " + text) + exclusiveGroup: radioGroup + } + + RadioButton { + text: "Radio Button 1" + onClicked: console.log("You Clicked The " + text) + exclusiveGroup: radioGroup + } + + RadioButton { + text: "Radio Button 2" + onClicked: console.log("You Clicked The " + text) + exclusiveGroup: radioGroup + } + } + }`) + + //Check Box + createWidget("Check Box", ` + Item { + CheckBox { + anchors.centerIn: parent + text: "Check Box" + onClicked: console.log("You Clicked The Check Box :", checked) + } + }`) + + //Dialog Button Box + createWidget("Dialog Button Box", ` + Item { + RowLayout { + anchors.fill: parent + + Button { + text: "Cancel" + onClicked: console.log("You Clicked The Accept Button") + } + + Button { + text: "OK" + isDefault: true + onClicked: console.log("You Clicked The Reject Button") + } + } + }`) + +} diff --git a/internal/examples/common/qml/containers.go b/internal/examples/common/qml/containers.go new file mode 100644 index 00000000..d3dcc520 --- /dev/null +++ b/internal/examples/common/qml/containers.go @@ -0,0 +1,145 @@ +package main + +func containers() { + + //Group Box + createWidget("Group Box", ` + Item { + GroupBox { + anchors.centerIn: parent + title: "Group Box" + + ColumnLayout { + Button { + text: "Push Button: 0" + } + + Button { + text: "Push Button: 1" + } + + Button { + text: "Push Button: 2" + } + } + } + }`) + + //Scroll Area + createWidget("Scroll Area", ` + ScrollView { + GridLayout { + width: 250 + height: 250 + + rowSpacing: 0 + columnSpacing: 0 + columns: 2 + + Rectangle { + Layout.fillWidth: true + Layout.fillHeight: true + color: "blue" + } + + Rectangle { + Layout.fillWidth: true + Layout.fillHeight: true + color: "red" + } + + Rectangle { + Layout.fillWidth: true + Layout.fillHeight: true + color: "green" + } + + Rectangle { + Layout.fillWidth: true + Layout.fillHeight: true + color: "yellow" + } + } + }`) + + //Tab Widget + createWidget("Tab Widget", ` + TabView { + Tab { + title: "red" + Rectangle { color: "red" } + } + Tab { + title: "blue" + Rectangle { color: "blue" } + } + Tab { + title: "green" + Rectangle { color: "green" } + } + Tab { + title: "yellow" + Rectangle { color: "yellow" } + } + }`) + + //Stacked Widget + createWidget("Stacked Widget", ` + MouseArea { + + Text { + z: 1 + anchors.centerIn: parent + text: "Click Me!" + } + + StackView { + id: stack + anchors.fill: parent + + initialItem: blue + + Rectangle { + id: blue + color: "blue" + } + + Rectangle { + id: red + color: "red" + } + + Rectangle { + id: green + color: "green" + } + + Rectangle { + id: yellow + color: "yellow" + } + } + + onClicked: { + switch (stack.depth) { + case 1: + stack.push(red) + break; + + case 2: + stack.push(green) + break; + + case 3: + stack.push(yellow) + break; + + case 4: + stack.pop(blue) + break; + } + } + } + `) + +} diff --git a/internal/examples/common/qml/displayWidgets.go b/internal/examples/common/qml/displayWidgets.go new file mode 100644 index 00000000..c5a402c6 --- /dev/null +++ b/internal/examples/common/qml/displayWidgets.go @@ -0,0 +1,64 @@ +package main + +func displayWidgets() { + + //Label + createWidget("Label", ` + Item { + Label { + anchors.centerIn: parent + text: "This Is A Label" + } + }`) + + //Text + createWidget("Text", ` + Item { + Text { + anchors.centerIn: parent + text: "This Is A Text Item" + } + }`) + + //Calendar Widget + createWidget("Calendar Widget", ` + Calendar { + onClicked: console.log("Calender Widget Selected Date Changed To:", date) + }`) + + //Progress Bar + createWidget("Progress Bar", ` + Item { + ProgressBar { + id: progressBar + anchors.centerIn: parent + + minimumValue: 0 + maximumValue: 1000 + value: 500 + + NumberAnimation on value { + from: 0 + to: 1000 + duration: 4000 + loops: Animation.Infinite + } + } + }`) + + //Image + createWidget("Image", ` + Image { + fillMode: Image.PreserveAspectFit + source: "qrc:///qml/earth.png" + }`) + + //BusyIndicator + createWidget("Busy Indicator", ` + Item { + BusyIndicator { + anchors.centerIn: parent + } + }`) + +} diff --git a/internal/examples/common/qml/inputWidgets.go b/internal/examples/common/qml/inputWidgets.go new file mode 100644 index 00000000..244b5ec5 --- /dev/null +++ b/internal/examples/common/qml/inputWidgets.go @@ -0,0 +1,170 @@ +package main + +import ( + "github.com/therecipe/qt/core" +) + +func inputWidgets() { + + //Abstract List Model Used By The Combo Box + listDB := []string{"Some", "Combo", "Box", "Items"} + listModel := core.NewQAbstractListModel(nil) + listModel.ConnectRowCount(func(parent *core.QModelIndex) int { + return len(listDB) + }) + listModel.ConnectData(func(index *core.QModelIndex, role int) *core.QVariant { + if role != int(core.Qt__DisplayRole) { + return core.NewQVariant() + } + return core.NewQVariant14(listDB[index.Row()]) + }) + + //Combo Box + createWidget("Combo Box", ` + Item { + ComboBox { + anchors.centerIn: parent + model: ["Some", "Combo", "Box", "Items"] + onActivated: console.log("Combo Box Index Changed To:", index, model[index]) + } + }`) + + //Combo Box + List Model + createWidget("Combo Box + List Model", ` + Item { + ComboBox { + anchors.centerIn: parent + model: ListModel { + ListElement { text: "Some" } + ListElement { text: "Combo" } + ListElement { text: "Box" } + ListElement { text: "Items" } + } + + onActivated: console.log("Combo Box Index Changed To:", index, model.get(index).text) + } + }`) + + //Combo Box + Go Model + createWidgetWithContext("Combo Box + Go Model", ` + Item { + ComboBox { + anchors.centerIn: parent + model: goListModel + + textRole: "display" + onActivated: console.log("Combo Box Index Changed To:", index, model.data(model.index(index, 0))) + } + }`, "goListModel", listModel) + + //Combo Box + Go String List Model + createWidgetWithContext("Combo Box + Go String List Model", ` + Item { + ComboBox { + anchors.centerIn: parent + model: goListModel + + textRole: "display" + onActivated: console.log("Combo Box Index Changed To:", index, model.data(model.index(index, 0))) + } + }`, "goListModel", core.NewQStringListModel2(listDB, nil)) + + //Text Field + createWidget("Text Field", ` + Item { + TextField { + anchors.centerIn: parent + onTextChanged: console.log("Text Field Text Changed To:", text) + } + } + `) + + //Text Input + createWidget("Text Input", ` + Item { + TextInput { + anchors.centerIn: parent + text: "Some Editable Text" + onTextChanged: console.log("Text Input Text Changed To:", text) + } + } + `) + + //Text Area + createWidget("Text Area", ` + TextArea { + onTextChanged: console.log("Text Area Text Changed To:", text) + } + `) + + //Text Edit + createWidget("Text Edit", ` + TextEdit { + onTextChanged: console.log("Text Edit Text Changed To:", text) + } + `) + + //Spin Box + createWidget("Spin Box", ` + Item { + SpinBox { + anchors.centerIn: parent + minimumValue: 0 + maximumValue: 1000 + value: 500 + onValueChanged: console.log("Spin Box Value Changed To:", value) + } + }`) + + //Double Spin Box + createWidget("Double Spin Box", ` + Item { + SpinBox { + anchors.centerIn: parent + minimumValue: 0 + maximumValue: 1000 + value: 500 + decimals: 2 + onValueChanged: console.log("Spin Box Value Changed To:", value) + } + }`) + + //Switch + createWidget("Switch", ` + Item { + Switch { + anchors.centerIn: parent + onClicked: console.log("Switch Button Clicked:", checked) + } + }`) + + //Horizontal Slider + createWidget("Horizontal Slider", ` + Item { + Slider { + anchors.centerIn: parent + minimumValue: 0 + maximumValue: 1000 + value: 500 + orientation: Qt.Horizontal + stepSize: 1 + onValueChanged: console.log("Horizontal Slider Value Changed To:", value) + } + } + `) + + //Vertical Slider + createWidget("Vertical Slider", ` + Item { + Slider { + anchors.centerIn: parent + minimumValue: 0 + maximumValue: 1000 + value: 500 + orientation: Qt.Vertical + stepSize: 1 + onValueChanged: console.log("Vertical Slider Value Changed To:", value) + } + } +`) +} diff --git a/internal/examples/common/qml/itemViews.go b/internal/examples/common/qml/itemViews.go new file mode 100644 index 00000000..1ece4bd0 --- /dev/null +++ b/internal/examples/common/qml/itemViews.go @@ -0,0 +1,301 @@ +package main + +import ( + "github.com/therecipe/qt/core" + "github.com/therecipe/qt/gui" +) + +func itemViews() { + + //Abstract List Model Used By The List And Table View + listDB := []map[string]string{ + {"name": "Apple", "cost": "2.45"}, + {"name": "Orange", "cost": "3.25"}, + {"name": "Banana", "cost": "1.95"}, + } + listRoles := map[int]*core.QByteArray{ + int(core.Qt__UserRole) + 1: core.NewQByteArray2("name", -1), + int(core.Qt__UserRole) + 2: core.NewQByteArray2("cost", -1), + } + + listModel := core.NewQAbstractListModel(nil) + listModel.ConnectRowCount(func(parent *core.QModelIndex) int { + return len(listDB) + }) + listModel.ConnectData(func(index *core.QModelIndex, role int) *core.QVariant { + if _, ok := listRoles[role]; !ok { + return core.NewQVariant() + } + return core.NewQVariant14(listDB[index.Row()][listRoles[role].ConstData()]) + }) + listModel.ConnectRoleNames(func() map[int]*core.QByteArray { + return listRoles + }) + + //Standard Item Model Used By The Tree View + treeModel := gui.NewQStandardItemModel(nil) + rootNode := treeModel.InvisibleRootItem() + + americaItem := gui.NewQStandardItem2("America") + mexicoItem := gui.NewQStandardItem2("Canada") + usaItem := gui.NewQStandardItem2("USA") + bostonItem := gui.NewQStandardItem2("Boston") + europeItem := gui.NewQStandardItem2("Europe") + italyItem := gui.NewQStandardItem2("Italy") + romeItem := gui.NewQStandardItem2("Rome") + veronaItem := gui.NewQStandardItem2("Verona") + + rootNode.AppendRow2(americaItem) + rootNode.AppendRow2(europeItem) + americaItem.AppendRow2(mexicoItem) + americaItem.AppendRow2(usaItem) + usaItem.AppendRow2(bostonItem) + europeItem.AppendRow2(italyItem) + italyItem.AppendRow2(romeItem) + italyItem.AppendRow2(veronaItem) + + //List View + List Model + createWidget("List View + List Model", ` + ListView { + model: ListModel { + + ListElement { + name: "Apple" + cost: 2.45 + } + + ListElement { + name: "Orange" + cost: 3.25 + } + + ListElement { + name: "Banana" + cost: 1.95 + } + } + + delegate: RowLayout { + Text { text: "Fruit: " + name } + Text { text: "Cost: $" + cost } + } + }`) + + //List View + JSON Model + createWidget("List View + JSON Model", ` + ListView { + model: ListModel { + + Component.onCompleted: { + var elements = + [ + { "name": "Apple", "cost": "2.45" }, + { "name": "Orange", "cost": "3.25" }, + { "name": "Banana", "cost": "1.95" } + ] + + for (var i = 0; i < elements.length; i++) { + append(elements[i]) + } + } + } + + delegate: RowLayout { + Text { text: "Fruit: " + name } + Text { text: "Cost: $" + cost } + } + }`) + + //List View + Go Model + createWidgetWithContext("List View + Go Model", ` + ListView { + model: goListModel + + delegate: RowLayout { + Text { text: "Fruit: " + name } + Text { text: "Cost: $" + cost } + } + }`, "goListModel", listModel) + + //List View + Go String List Model + createWidgetWithContext("List View + Go String List Model", ` + ListView { + model: goListModel + delegate: Text { text: display } + }`, "goListModel", core.NewQStringListModel2([]string{"Some", "String", "List", "Items"}, nil)) + + //Tree View + List Model + //TODO: + + //Tree View + JSON Model + //TODO: + + //Tree View + Go Model + createWidgetWithContext("Tree View + Go Model", ` + TreeView { + model: goTreeModel + + TableViewColumn { + role: "display" + } + }`, "goTreeModel", treeModel) + + //Table View + List Model + createWidget("Table View + List Model", ` + TableView { + model: ListModel { + + ListElement { + name: "Apple" + cost: 2.45 + } + + ListElement { + name: "Orange" + cost: 3.25 + } + + ListElement { + name: "Banana" + cost: 1.95 + } + } + + TableViewColumn { + role: "name" + title: role + } + + TableViewColumn { + role: "cost" + title: role + } + }`) + + //Table View + JSON Model + createWidget("Table View + JSON Model", ` + TableView { + model: ListModel { + + Component.onCompleted: { + var elements = + [ + { "name": "Apple", "cost": "2.45" }, + { "name": "Orange", "cost": "3.25" }, + { "name": "Banana", "cost": "1.95" } + ] + + for (var i = 0; i < elements.length; i++) { + append(elements[i]) + } + } + } + + TableViewColumn { + role: "name" + title: role + } + + TableViewColumn { + role: "cost" + title: role + } + }`) + + //Table View + Go Model + createWidgetWithContext("Table View + Go Model", ` + TableView { + model: goListModel + + TableViewColumn { + role: "name" + title: role + } + + TableViewColumn { + role: "cost" + title: role + } + }`, "goListModel", listModel) + + //Grid View + List Model + createWidget("Grid View + List Model", ` + GridView { + cellWidth: width / (model.count / 2) + cellHeight: height / (model.count / 2) + + model: ListModel { + + ListElement { + color: "blue" + } + + ListElement { + color: "red" + } + + ListElement { + color: "green" + } + + ListElement { + color: "yellow" + } + } + + delegate: Rectangle { + width: cellWidth + height: cellHeight + + color: model.color + } + }`) + + //Grid View + JSON Model + createWidget("Grid View + JSON Model", ` + GridView { + cellWidth: width / (model.count / 2) + cellHeight: height / (model.count / 2) + + model: ListModel { + + Component.onCompleted: { + var elements = + [ + { "color": "blue" }, + { "color": "red" }, + { "color": "green" }, + { "color": "yellow" } + ] + + for (var i = 0; i < elements.length; i++) { + append(elements[i]) + } + } + } + + delegate: Rectangle { + width: cellWidth + height: cellHeight + + color: model.color + } + }`) + + //Grid View + Go Model + createWidgetWithContext("Grid View + Go Model", ` + GridView { + cellWidth: width / (model.count / 2) + cellHeight: height / (model.count / 2) + + model: goListModel + + delegate: Rectangle { + width: cellWidth + height: cellHeight + + color: display + } + }`, "goListModel", core.NewQStringListModel2([]string{"blue", "red", "green", "yellow"}, nil)) + +} diff --git a/internal/examples/common/qml/layouts.go b/internal/examples/common/qml/layouts.go new file mode 100644 index 00000000..e93456b4 --- /dev/null +++ b/internal/examples/common/qml/layouts.go @@ -0,0 +1,117 @@ +package main + +func layouts() { + + //Vertical Layout + createWidget("Vertical Layout", ` + ColumnLayout { + spacing: 0 + + Rectangle { + Layout.fillWidth: true + Layout.preferredHeight: parent.height * 0.3 + color: "blue" + } + + Rectangle { + Layout.fillWidth: true + Layout.fillHeight: true + color: "red" + } + }`) + + //Horizontal Layout + createWidget("Horizontal Layout", ` + RowLayout { + spacing: 0 + + Rectangle { + Layout.preferredWidth: parent.width * 0.3 + Layout.fillHeight: true + color: "blue" + } + + Rectangle { + Layout.fillWidth: true + Layout.fillHeight: true + color: "red" + } + }`) + + //Grid Layout + createWidget("Grid Layout", ` + GridLayout { + rowSpacing: 0 + columnSpacing: 0 + columns: 2 + + Rectangle { + Layout.fillWidth: true + Layout.fillHeight: true + color: "blue" + } + + Rectangle { + Layout.fillWidth: true + Layout.fillHeight: true + color: "red" + } + + Rectangle { + Layout.fillWidth: true + Layout.fillHeight: true + color: "green" + } + + Rectangle { + Layout.fillWidth: true + Layout.fillHeight: true + color: "yellow" + } + }`) + + //Stack Layout + createWidget("Stack Layout", ` + MouseArea { + + Text { + z: 1 + anchors.centerIn: parent + text: "Click Me!" + } + + StackLayout { + id: stackLayout + anchors.fill: parent + + Rectangle { + Layout.fillWidth: true + Layout.fillHeight: true + color: "blue" + } + + Rectangle { + Layout.fillWidth: true + Layout.fillHeight: true + color: "red" + } + + Rectangle { + Layout.fillWidth: true + Layout.fillHeight: true + color: "green" + } + + Rectangle { + Layout.fillWidth: true + Layout.fillHeight: true + color: "yellow" + } + + onCurrentIndexChanged: if (currentIndex >= count) { currentIndex = 0 } + } + + onClicked: stackLayout.currentIndex++ + }`) + +} diff --git a/internal/examples/common/qml/main.go b/internal/examples/common/qml/main.go new file mode 100644 index 00000000..243a2fd6 --- /dev/null +++ b/internal/examples/common/qml/main.go @@ -0,0 +1,82 @@ +package main + +import ( + "io/ioutil" + "os" + "path/filepath" + "strings" + + "github.com/therecipe/qt/core" + "github.com/therecipe/qt/quick" + "github.com/therecipe/qt/widgets" +) + +var ( + centralLayout *widgets.QGridLayout + centralLayoutRow int + centralLayoutColumn int +) + +func main() { + widgets.NewQApplication(len(os.Args), os.Args) + + mainWindow := widgets.NewQMainWindow(nil, 0) + mainWindow.SetWindowTitle("Common QML (+ Quick Controls 1)") + + scrollWidget := widgets.NewQScrollArea(nil) + + centralWidget := widgets.NewQWidget(nil, 0) + centralLayout = widgets.NewQGridLayout(centralWidget) + + layouts() + buttons() + itemViews() + containers() + inputWidgets() + displayWidgets() + + scrollWidget.SetWidget(centralWidget) + + mainWindow.SetCentralWidget(scrollWidget) + mainWindow.ShowMaximized() + + widgets.QApplication_Exec() +} + +func addWidget(widget widgets.QWidget_ITF) { + + if centralLayoutColumn > 6 { + centralLayoutColumn = 0 + centralLayoutRow++ + } + + wrappedWidget := widgets.NewQGroupBox2(widget.QWidget_PTR().WindowTitle(), nil) + wrappedWidgetLayout := widgets.NewQVBoxLayout2(wrappedWidget) + wrappedWidgetLayout.AddWidget(widget, 0, core.Qt__AlignCenter) + + widget.QWidget_PTR().SetFixedSize2(200, 200) + + wrappedWidget.SetFixedSize2(250, 250) + + centralLayout.AddWidget(wrappedWidget, centralLayoutRow, centralLayoutColumn, core.Qt__AlignCenter) + + centralLayoutColumn++ +} + +func createWidgetWithContext(name, code, ctxName string, ctx core.QObject_ITF) { + quickWidget := quick.NewQQuickWidget(nil) + quickWidget.SetWindowTitle(name) + + quickWidget.RootContext().SetContextProperty(ctxName, ctx) + + quickWidget.SetResizeMode(quick.QQuickWidget__SizeRootObjectToView) + + path := filepath.Join(os.TempDir(), "tmp"+strings.Replace(name, " ", "", -1)+".qml") + ioutil.WriteFile(path, []byte("import QtQuick 2.0\nimport QtQuick.Layouts 1.3\nimport QtQuick.Controls 1.4\n"+code), 0644) + quickWidget.SetSource(core.QUrl_FromLocalFile(path)) + addWidget(quickWidget) +} + +func createWidget(name, code string) { + createWidgetWithContext(name, code, "", nil) +} diff --git a/internal/examples/common/qml/qml/earth.png b/internal/examples/common/qml/qml/earth.png new file mode 100644 index 00000000..7bfef7cc Binary files /dev/null and b/internal/examples/common/qml/qml/earth.png differ diff --git a/internal/examples/common/qml/qml/stub.qml b/internal/examples/common/qml/qml/stub.qml new file mode 100644 index 00000000..b382eaab --- /dev/null +++ b/internal/examples/common/qml/qml/stub.qml @@ -0,0 +1,7 @@ +import QtQuick 2.0 +import QtQuick.Layouts 1.3 +import QtQuick.Controls 1.4 + +Item {} + +//this file is just here to inform qtdeploy about the needed QML dependencies diff --git a/internal/examples/common/widgets/buttons.go b/internal/examples/common/widgets/buttons.go new file mode 100644 index 00000000..ae176d50 --- /dev/null +++ b/internal/examples/common/widgets/buttons.go @@ -0,0 +1,83 @@ +package main + +import ( + "fmt" + + "github.com/therecipe/qt/core" + "github.com/therecipe/qt/widgets" +) + +func buttons() { + + //Push Button + pushButton := widgets.NewQPushButton2("Push Button", nil) + pushButton.SetWindowTitle("Push Button") + + pushButton.ConnectClicked(func(checked bool) { + println("You Clicked The Push Button") + }) + addWidget(pushButton) + + //Tool Button (+ ToolBar) + toolWindow := widgets.NewQMainWindow(nil, 0) + toolWindow.SetWindowTitle("Tool Button") + + toolBar := toolWindow.AddToolBar3("Just Some ToolBar") + toolBar.SetAllowedAreas(core.Qt__AllToolBarAreas) + toolBar.SetMovable(true) + toolBar.SetFloatable(true) + + toolButton := widgets.NewQToolButton(nil) + toolButton.SetIcon(toolButton.Style().StandardIcon(widgets.QStyle__SP_DialogHelpButton, nil, nil)) + toolButton.ConnectClicked(func(checked bool) { + println("You Clicked The Tool Button") + toolBar.AddSeparator() + }) + toolBar.AddWidget(toolButton) + addWidget(toolWindow) + + //Radio Button + radioButtonGroup := widgets.NewQWidget(nil, 0) + radioButtonGroup.SetWindowTitle("Radio Button") + radioButtonGroupLayout := widgets.NewQVBoxLayout2(radioButtonGroup) + + for i := 0; i < 3; i++ { + radioButton := widgets.NewQRadioButton2(fmt.Sprintf("Radio Button %v", i), nil) + radioButton.ConnectClicked(func(checked bool) { + println("You Clicked The " + radioButton.Text()) + }) + radioButtonGroupLayout.AddWidget(radioButton, 0, 0) + } + addWidget(radioButtonGroup) + + //Check Box + checkBox := widgets.NewQCheckBox2("Check Box", nil) + checkBox.SetWindowTitle("Check Box") + + checkBox.ConnectClicked(func(checked bool) { + println("You Clicked The Check Box :", checked) + }) + addWidget(checkBox) + + //Command Link Button + commandLinkButton := widgets.NewQCommandLinkButton2("Command Link Button", nil) + commandLinkButton.SetWindowTitle("Command Link Button") + + commandLinkButton.ConnectClicked(func(checked bool) { + println("You Clicked The Command Link Button") + }) + addWidget(commandLinkButton) + + //Dialog Button Box + dialogButtonBox := widgets.NewQDialogButtonBox3(widgets.QDialogButtonBox__Cancel|widgets.QDialogButtonBox__Ok, nil) + dialogButtonBox.SetWindowTitle("Dialog Button Box") + + dialogButtonBox.ConnectAccepted(func() { + println("You Clicked The Accept Button") + }) + dialogButtonBox.ConnectRejected(func() { + println("You Clicked The Reject Button") + }) + addWidget(dialogButtonBox) + +} diff --git a/internal/examples/common/widgets/containers.go b/internal/examples/common/widgets/containers.go new file mode 100644 index 00000000..64d9eab1 --- /dev/null +++ b/internal/examples/common/widgets/containers.go @@ -0,0 +1,151 @@ +package main + +import ( + "fmt" + + "github.com/therecipe/qt/core" + "github.com/therecipe/qt/widgets" +) + +func containers() { + + //Group Box + groupBox := widgets.NewQGroupBox2("Group Box", nil) + groupBox.SetWindowTitle("Group Box") + groupBoxLayout := widgets.NewQVBoxLayout2(groupBox) + + for i := 0; i < 3; i++ { + groupBoxLayout.AddWidget(widgets.NewQPushButton2(fmt.Sprintf("PushButton: %v", i), nil), 0, 0) + } + addWidget(groupBox) + + //Scroll Area + scrollArea := widgets.NewQScrollArea(nil) + scrollArea.SetWindowTitle("Scroll Area") + + scrollAreaWidget := widgets.NewQWidget(nil, 0) + scrollAreaWidgetLayout := widgets.NewQGridLayout(scrollAreaWidget) + for row := 0; row < 25; row++ { + for column := 0; column < 25; column++ { + scrollAreaWidgetLayout.AddWidget(widgets.NewQLabel2(fmt.Sprintf("[%v:%v]", row, column), nil, 0), row, column, core.Qt__AlignCenter) + } + } + + scrollArea.SetWidget(scrollAreaWidget) + addWidget(scrollArea) + + //Tool Box + toolBox := widgets.NewQToolBox(nil, 0) + toolBox.SetWindowTitle("Tool Box") + + toolBox.AddItem2(widgets.NewQLabel2("First Widget", nil, 0), "First") + toolBox.AddItem2(widgets.NewQPushButton2("Second Widget", nil), "Second") + toolBox.AddItem2(widgets.NewQGroupBox2("Third Widget", nil), "Third") + addWidget(toolBox) + + //Tab Widget + tabWidget := widgets.NewQTabWidget(nil) + tabWidget.SetWindowTitle("Tab Widget") + + tabWidget.AddTab(widgets.NewQLabel2("First Widget", nil, 0), "First") + tabWidget.AddTab(widgets.NewQPushButton2("Second Widget", nil), "Second") + tabWidget.AddTab(widgets.NewQGroupBox2("Third Widget", nil), "Third") + addWidget(tabWidget) + + //Stacked Widget + centralWidget := widgets.NewQWidget(nil, 0) + centralWidget.SetWindowTitle("Stacked Widget") + centralWidgetLayout := widgets.NewQVBoxLayout2(centralWidget) + + stackedWidget := widgets.NewQStackedWidget(nil) + stackedWidget.AddWidget(widgets.NewQLabel2("First Widget", nil, 0)) + stackedWidget.AddWidget(widgets.NewQPushButton2("Second Widget", nil)) + stackedWidget.AddWidget(widgets.NewQGroupBox2("Third Widget", nil)) + centralWidgetLayout.AddWidget(stackedWidget, 0, 0) + + changeStackButton := widgets.NewQPushButton2("Show Next In Stack", nil) + changeStackButton.ConnectClicked(func(checked bool) { + nextIndex := stackedWidget.CurrentIndex() + 1 + if nextIndex >= stackedWidget.Count() { + stackedWidget.SetCurrentIndex(0) + } else { + stackedWidget.SetCurrentIndex(nextIndex) + } + }) + centralWidgetLayout.AddWidget(changeStackButton, 0, 0) + addWidget(centralWidget) + + //Frame + frame := widgets.NewQFrame(nil, 0) + frame.SetWindowTitle("Frame") + + frameLayout := widgets.NewQVBoxLayout2(frame) + + for i := 0; i < 3; i++ { + someFrame := widgets.NewQFrame(nil, 0) + + switch i { + case 0: + someFrame.SetFrameStyle(int(widgets.QFrame__Box) | int(widgets.QFrame__Raised)) + + case 1: + someFrame.SetFrameStyle(int(widgets.QFrame__Panel) | int(widgets.QFrame__Raised)) + + case 2: + someFrame.SetFrameStyle(int(widgets.QFrame__StyledPanel) | int(widgets.QFrame__Raised)) + } + + someFrameLayout := widgets.NewQVBoxLayout2(someFrame) + someFrameLayout.AddWidget(widgets.NewQPushButton2(fmt.Sprintf("PushButton: %v", i), nil), 0, 0) + frameLayout.AddWidget(someFrame, 0, 0) + } + addWidget(frame) + + //Widget + widget := widgets.NewQWidget(nil, 0) + widget.SetWindowTitle("Widget") + + widgetLayout := widgets.NewQVBoxLayout2(widget) + + for i := 0; i < 3; i++ { + someWidget := widgets.NewQWidget(nil, 0) + someWidgetLayout := widgets.NewQVBoxLayout2(someWidget) + someWidgetLayout.AddWidget(widgets.NewQPushButton2(fmt.Sprintf("PushButton: %v", i), nil), 0, 0) + widgetLayout.AddWidget(someWidget, 0, 0) + } + addWidget(widget) + + //MDI Area + mdiArea := widgets.NewQMdiArea(nil) + mdiArea.SetWindowTitle("MDI Area") + + subWindow := widgets.NewQMdiSubWindow(nil, 0) + sWCentralWidget := widgets.NewQWidget(nil, 0) + sWCentralWidgetLayout := widgets.NewQVBoxLayout2(sWCentralWidget) + + sWCentralWidgetLayout.AddWidget(widgets.NewQLabel2("Label", nil, 0), 0, 0) + sWCentralWidgetLayout.AddWidget(widgets.NewQPushButton2("PushButton", nil), 0, 0) + + subWindow.SetWidget(sWCentralWidget) + mdiArea.AddSubWindow(subWindow, 0) + + mdiArea.Resize2(300, 300) + addWidget(mdiArea) + + //Dock Widget + mainWindow := widgets.NewQMainWindow(nil, 0) + mainWindow.SetWindowTitle("Dock Widget") + + topDockWidget := widgets.NewQDockWidget("Top Dock Widget", nil, 0) + topDockWidget.SetAllowedAreas(core.Qt__AllDockWidgetAreas) + topDockWidget.SetFloating(true) + topDockWidget.SetWidget(widgets.NewQPushButton2("PushButton", nil)) + mainWindow.AddDockWidget(core.Qt__TopDockWidgetArea, topDockWidget) + + bottomDockWidget := widgets.NewQDockWidget("Bottom Dock Widget", nil, 0) + bottomDockWidget.SetAllowedAreas(core.Qt__AllDockWidgetAreas) + bottomDockWidget.SetFloating(true) + bottomDockWidget.SetWidget(widgets.NewQPushButton2("PushButton", nil)) + mainWindow.AddDockWidget(core.Qt__BottomDockWidgetArea, bottomDockWidget) + addWidget(mainWindow) +} diff --git a/internal/examples/common/widgets/displayWidgets.go b/internal/examples/common/widgets/displayWidgets.go new file mode 100644 index 00000000..e4954503 --- /dev/null +++ b/internal/examples/common/widgets/displayWidgets.go @@ -0,0 +1,85 @@ +package main + +import ( + "io/ioutil" + "os" + "path/filepath" + "time" + + "github.com/therecipe/qt/core" + "github.com/therecipe/qt/gui" + "github.com/therecipe/qt/quick" + "github.com/therecipe/qt/widgets" +) + +func displayWidgets() { + + //Label + label := widgets.NewQLabel2("This Is A Label", nil, 0) + label.SetWindowTitle("Label") + addWidget(label) + + //Text Browser + textBrowser := widgets.NewQTextBrowser(nil) + textBrowser.SetWindowTitle("Text Browser") + + textBrowser.SetText("This Is A Text Browser") + addWidget(textBrowser) + + //Graphics View + graphicsView := widgets.NewQGraphicsView(nil) + graphicsView.SetWindowTitle("Graphics View") + + scene := widgets.NewQGraphicsScene(nil) + scene.AddText("This Is A Graphics View (+ Graphics Scene)", gui.NewQFont()) + scene.AddRect2(0, 0, scene.Width(), scene.Height(), gui.NewQPen(), gui.NewQBrush()) + + graphicsView.SetScene(scene) + addWidget(graphicsView) + + //Calendar Widget + calendarWidget := widgets.NewQCalendarWidget(nil) + calendarWidget.SetWindowTitle("Calendar Widget") + addWidget(calendarWidget) + + //LCD Number + lcdNumber := widgets.NewQLCDNumber(nil) + lcdNumber.SetWindowTitle("LCD Number") + + lcdNumber.SetDigitCount(15) + lcdNumber.Display("0123456789.-ABC") + addWidget(lcdNumber) + + //Progress Bar + progressBar := widgets.NewQProgressBar(nil) + progressBar.SetWindowTitle("Progress Bar") + + progressBar.SetMinimum(0) + progressBar.SetMaximum(1000) + progressBar.SetValue(progressBar.Maximum() / 2) + + progressBar.ConnectValueChanged(func(value int) { + if value == progressBar.Maximum() { + progressBar.SetValue(progressBar.Minimum()) + } + }) + + go func() { + for range time.NewTicker(500 * time.Millisecond).C { + progressBar.SetValue(progressBar.Value() + 50) + } + }() + addWidget(progressBar) + + //Quick Widget + quickWidget := quick.NewQQuickWidget(nil) + quickWidget.SetWindowTitle("Quick Widget") + + quickWidget.SetResizeMode(quick.QQuickWidget__SizeRootObjectToView) + + path := filepath.Join(os.TempDir(), "tmpQuickWidget.qml") + ioutil.WriteFile(path, []byte("import QtQuick 2.0\nRectangle{width: 320; height: 320; color:\"red\"}"), 0644) + quickWidget.SetSource(core.QUrl_FromLocalFile(path)) + addWidget(quickWidget) + +} diff --git a/internal/examples/common/widgets/inputWidgets.go b/internal/examples/common/widgets/inputWidgets.go new file mode 100644 index 00000000..7d8e7ac8 --- /dev/null +++ b/internal/examples/common/widgets/inputWidgets.go @@ -0,0 +1,224 @@ +package main + +import ( + "github.com/therecipe/qt/core" + "github.com/therecipe/qt/gui" + "github.com/therecipe/qt/widgets" +) + +func inputWidgets() { + + //Combo Box + comboBox := widgets.NewQComboBox(nil) + comboBox.SetWindowTitle("Combo Box") + + items := []string{"Some", "Combo", "Box", "Items"} + comboBox.AddItems(items) + + comboBox.ConnectCurrentIndexChanged2(func(text string) { + println("Combo Box Index Changed To:", text) + }) + addWidget(comboBox) + + //Combo Box + List Model + comboBoxL := widgets.NewQComboBox(nil) + comboBoxL.SetWindowTitle("Combo Box + List Model") + + listModel := core.NewQAbstractListModel(nil) + listModel.ConnectRowCount(func(parent *core.QModelIndex) int { + return len(items) + }) + listModel.ConnectData(func(index *core.QModelIndex, role int) *core.QVariant { + if role != int(core.Qt__DisplayRole) { + return core.NewQVariant() + } + return core.NewQVariant14(items[index.Row()]) + }) + + comboBoxL.SetModel(listModel) + + comboBoxL.ConnectCurrentIndexChanged2(func(text string) { + println("Combo Box Index Changed To:", text) + }) + addWidget(comboBoxL) + + //Combo Box + String List Model + comboBoxSL := widgets.NewQComboBox(nil) + comboBoxSL.SetWindowTitle("Combo Box + String List Model") + comboBoxSL.SetModel(core.NewQStringListModel2(items, nil)) + comboBoxSL.ConnectCurrentIndexChanged2(func(text string) { + println("Combo Box Index Changed To:", text) + }) + addWidget(comboBoxSL) + + //Font Combo Box + fontComboBox := widgets.NewQFontComboBox(nil) + fontComboBox.SetWindowTitle("Font Combo Box") + + fontComboBox.ConnectCurrentFontChanged(func(font *gui.QFont) { + println("Font Combo Box Index Changed To:", font.ToString()) + }) + addWidget(fontComboBox) + + //Line Edit + lineEdit := widgets.NewQLineEdit(nil) + lineEdit.SetWindowTitle("Line Edit") + + lineEdit.ConnectTextChanged(func(text string) { + println("Line Edit Text Changed To:", text) + }) + addWidget(lineEdit) + + //Text Edit + textEdit := widgets.NewQTextEdit(nil) + textEdit.SetWindowTitle("Text Edit") + + textEdit.ConnectTextChanged(func() { + println("Text Edit Text Changed To:", textEdit.ToPlainText()) + }) + addWidget(textEdit) + + //Plain Text Edit + plainTextEdit := widgets.NewQPlainTextEdit(nil) + plainTextEdit.SetWindowTitle("Plain Text Edit") + + plainTextEdit.ConnectTextChanged(func() { + println("Plain Text Edit Text Changed To:", plainTextEdit.ToPlainText()) + }) + addWidget(plainTextEdit) + + //Spin Box + spinBox := widgets.NewQSpinBox(nil) + spinBox.SetWindowTitle("Spin Box") + + spinBox.SetMinimum(0) + spinBox.SetMaximum(1000) + spinBox.SetValue(spinBox.Maximum() / 2) + + spinBox.ConnectValueChanged(func(i int) { + println("Spin Box Value Changed To:", i) + }) + addWidget(spinBox) + + //Double Spin Box + doubleSpinBox := widgets.NewQDoubleSpinBox(nil) + doubleSpinBox.SetWindowTitle("Double Spin Box") + + doubleSpinBox.SetMinimum(0) + doubleSpinBox.SetMaximum(1000) + doubleSpinBox.SetValue(doubleSpinBox.Maximum() / 2) + + doubleSpinBox.ConnectValueChanged(func(d float64) { + println("Double Spin Box Value Changed To:", d) + }) + addWidget(doubleSpinBox) + + //Time Edit + timeEdit := widgets.NewQTimeEdit(nil) + timeEdit.SetWindowTitle("Time Edit") + + timeEdit.SetTime(core.QTime_CurrentTime()) + + timeEdit.ConnectTimeChanged(func(time *core.QTime) { + println("Time Edit Time Changed To:", time.ToString2(core.Qt__TextDate)) + }) + addWidget(timeEdit) + + //Date Edit + dateEdit := widgets.NewQDateEdit(nil) + dateEdit.SetWindowTitle("Date Edit") + + dateEdit.SetDate(core.QDate_CurrentDate()) + + dateEdit.ConnectDateChanged(func(date *core.QDate) { + println("Date Edit Date Changed To:", date.ToString2(core.Qt__TextDate)) + }) + addWidget(dateEdit) + + //Date/Time Edit + dateTimeEdit := widgets.NewQDateTimeEdit(nil) + dateTimeEdit.SetWindowTitle("Date Time Edit") + + dateTimeEdit.SetDate(core.QDate_CurrentDate()) + dateTimeEdit.SetTime(core.QTime_CurrentTime()) + + dateTimeEdit.ConnectDateTimeChanged(func(datetime *core.QDateTime) { + println("Date Time Edit Changed To:", datetime.ToString2(core.Qt__TextDate)) + }) + addWidget(dateTimeEdit) + + //Dial + dial := widgets.NewQDial(nil) + dial.SetWindowTitle("Dial") + + dial.SetMinimum(0) + dial.SetMaximum(1000) + dial.SetValue(dial.Maximum() / 2) + + dial.ConnectValueChanged(func(value int) { + println("Dial Value Changed To:", value) + }) + addWidget(dial) + + //Horizontal Scroll Bar + hScrollBar := widgets.NewQScrollBar2(core.Qt__Horizontal, nil) + hScrollBar.SetWindowTitle("Horizontal Scroll Bar") + + hScrollBar.SetMinimum(0) + hScrollBar.SetMaximum(1000) + hScrollBar.SetValue(hScrollBar.Maximum() / 2) + + hScrollBar.ConnectValueChanged(func(value int) { + println("Horizontal Scroll Bar Value Changed To:", value) + }) + addWidget(hScrollBar) + + //Vertical Scroll Bar + vScrollBar := widgets.NewQScrollBar2(core.Qt__Vertical, nil) + vScrollBar.SetWindowTitle("Vertical Scroll Bar") + + vScrollBar.SetMinimum(0) + vScrollBar.SetMaximum(1000) + vScrollBar.SetValue(vScrollBar.Maximum() / 2) + + vScrollBar.ConnectValueChanged(func(value int) { + println("Vertical Scroll Bar Value Changed To:", value) + }) + addWidget(vScrollBar) + + //Horizontal Slider + hSlider := widgets.NewQSlider2(core.Qt__Horizontal, nil) + hSlider.SetWindowTitle("Horizontal Slider") + + hSlider.SetMinimum(0) + hSlider.SetMaximum(1000) + hSlider.SetValue(hSlider.Maximum() / 2) + + hSlider.ConnectValueChanged(func(value int) { + println("Horizontal Slider Value Changed To:", value) + }) + addWidget(hSlider) + + //Vertical Slider + vSlider := widgets.NewQSlider2(core.Qt__Vertical, nil) + vSlider.SetWindowTitle("Vertical Slider") + + vSlider.SetMinimum(0) + vSlider.SetMaximum(1000) + vSlider.SetValue(vSlider.Maximum() / 2) + + vSlider.ConnectValueChanged(func(value int) { + println("Vertical Slider Value Changed To:", value) + }) + addWidget(vSlider) + + //Key Sequence Edit + keySequenceEdit := widgets.NewQKeySequenceEdit(nil) + keySequenceEdit.SetWindowTitle("Key Sequence Edit") + + keySequenceEdit.ConnectKeySequenceChanged(func(keySequence *gui.QKeySequence) { + println("Key Sequence Edit Key Sequence Changed To:", keySequence.ToString(gui.QKeySequence__NativeText)) + }) + addWidget(keySequenceEdit) + +} diff --git a/internal/examples/common/widgets/itemViews.go b/internal/examples/common/widgets/itemViews.go new file mode 100644 index 00000000..81fc13fe --- /dev/null +++ b/internal/examples/common/widgets/itemViews.go @@ -0,0 +1,98 @@ +package main + +import ( + "github.com/therecipe/qt/core" + "github.com/therecipe/qt/gui" + "github.com/therecipe/qt/widgets" +) + +func itemViews() { + + //List View + listView := widgets.NewQListView(nil) + listView.SetWindowTitle("List View") + + list := []string{"This", "Is", "A", "List", "View"} + + listModel := core.NewQAbstractListModel(nil) + listModel.ConnectRowCount(func(parent *core.QModelIndex) int { + return len(list) + }) + listModel.ConnectData(func(index *core.QModelIndex, role int) *core.QVariant { + if role != int(core.Qt__DisplayRole) { + return core.NewQVariant() + } + return core.NewQVariant14(list[index.Row()]) + }) + listView.SetModel(listModel) + addWidget(listView) + + //List View + String List Model + listViewS := widgets.NewQListView(nil) + listViewS.SetWindowTitle("List View + String List Model") + listViewS.SetModel(core.NewQStringListModel2(list, nil)) + addWidget(listViewS) + + //Tree View + treeView := widgets.NewQTreeView(nil) + treeView.SetWindowTitle("Tree View") + + treeModel := gui.NewQStandardItemModel(nil) + rootNode := treeModel.InvisibleRootItem() + + americaItem := gui.NewQStandardItem2("America") + mexicoItem := gui.NewQStandardItem2("Canada") + usaItem := gui.NewQStandardItem2("USA") + bostonItem := gui.NewQStandardItem2("Boston") + europeItem := gui.NewQStandardItem2("Europe") + italyItem := gui.NewQStandardItem2("Italy") + romeItem := gui.NewQStandardItem2("Rome") + veronaItem := gui.NewQStandardItem2("Verona") + + rootNode.AppendRow2(americaItem) + rootNode.AppendRow2(europeItem) + americaItem.AppendRow2(mexicoItem) + americaItem.AppendRow2(usaItem) + usaItem.AppendRow2(bostonItem) + europeItem.AppendRow2(italyItem) + italyItem.AppendRow2(romeItem) + italyItem.AppendRow2(veronaItem) + + treeView.SetModel(treeModel) + treeView.ExpandAll() + addWidget(treeView) + + //Table View + tableView := widgets.NewQTableView(nil) + tableView.SetWindowTitle("Table View") + + table := [][]string{ + 0: {"This", "Is", "The", "First", "Row"}, + 1: {"This", "Is", "The", "Second", "Row"}, + 2: {"This", "Is", "The", "Third", "Row"}, + } + + tableModel := core.NewQAbstractTableModel(nil) + tableModel.ConnectRowCount(func(parent *core.QModelIndex) int { + return len(table) + }) + tableModel.ConnectColumnCount(func(parent *core.QModelIndex) int { + return len(table[0]) + }) + tableModel.ConnectData(func(index *core.QModelIndex, role int) *core.QVariant { + if role != int(core.Qt__DisplayRole) { + return core.NewQVariant() + } + return core.NewQVariant14(table[index.Row()][index.Column()]) + }) + tableView.SetModel(tableModel) + addWidget(tableView) + + //Column View + columnView := widgets.NewQColumnView(nil) + columnView.SetWindowTitle("Column View") + + columnView.SetModel(treeModel) + addWidget(columnView) + +} diff --git a/internal/examples/common/widgets/itemWidgets.go b/internal/examples/common/widgets/itemWidgets.go new file mode 100644 index 00000000..0a29e20b --- /dev/null +++ b/internal/examples/common/widgets/itemWidgets.go @@ -0,0 +1,65 @@ +package main + +import ( + "github.com/therecipe/qt/widgets" +) + +func itemWidgets() { + + //List Widget + listWidget := widgets.NewQListWidget(nil) + listWidget.SetWindowTitle("List Widget") + + list := []string{"This", "Is", "A", "List", "View"} + + listWidget.AddItems(list) + addWidget(listWidget) + + //Tree Widget + treeWidget := widgets.NewQTreeWidget(nil) + treeWidget.SetWindowTitle("Tree Widget") + + rootNode := treeWidget.InvisibleRootItem() + + americaItem := widgets.NewQTreeWidgetItem2([]string{"America"}, 0) + mexicoItem := widgets.NewQTreeWidgetItem2([]string{"Canada"}, 0) + usaItem := widgets.NewQTreeWidgetItem2([]string{"USA"}, 0) + bostonItem := widgets.NewQTreeWidgetItem2([]string{"Boston"}, 0) + europeItem := widgets.NewQTreeWidgetItem2([]string{"Europe"}, 0) + italyItem := widgets.NewQTreeWidgetItem2([]string{"Italy"}, 0) + romeItem := widgets.NewQTreeWidgetItem2([]string{"Rome"}, 0) + veronaItem := widgets.NewQTreeWidgetItem2([]string{"Verona"}, 0) + + rootNode.AddChild(americaItem) + rootNode.AddChild(europeItem) + americaItem.AddChild(mexicoItem) + americaItem.AddChild(usaItem) + usaItem.AddChild(bostonItem) + europeItem.AddChild(italyItem) + italyItem.AddChild(romeItem) + italyItem.AddChild(veronaItem) + + treeWidget.ExpandAll() + addWidget(treeWidget) + + //Table Widget + tableWidget := widgets.NewQTableWidget(nil) + tableWidget.SetWindowTitle("Table Widget") + + table := [][]string{ + 0: {"This", "Is", "The", "First", "Row"}, + 1: {"This", "Is", "The", "Second", "Row"}, + 2: {"This", "Is", "The", "Third", "Row"}, + } + + tableWidget.SetRowCount(len(table)) + tableWidget.SetColumnCount(len(table[0])) + + for row := 0; row < tableWidget.RowCount(); row++ { + for column := 0; column < tableWidget.ColumnCount(); column++ { + tableWidget.SetItem(row, column, widgets.NewQTableWidgetItem2(table[row][column], 0)) + } + } + addWidget(tableWidget) + +} diff --git a/internal/examples/common/widgets/layouts.go b/internal/examples/common/widgets/layouts.go new file mode 100644 index 00000000..9dfd6e6c --- /dev/null +++ b/internal/examples/common/widgets/layouts.go @@ -0,0 +1,54 @@ +package main + +import ( + "fmt" + + "github.com/therecipe/qt/core" + "github.com/therecipe/qt/widgets" +) + +func layouts() { + + //Vertical Layout + vboxWidget := widgets.NewQWidget(nil, 0) + vboxWidget.SetWindowTitle("Vertical Layout") + + vbox := widgets.NewQVBoxLayout2(vboxWidget) + vbox.AddWidget(widgets.NewQLabel2("one", nil, 0), 0, 0) + vbox.AddWidget(widgets.NewQLabel2("two", nil, 0), 0, 0) + vbox.AddWidget(widgets.NewQLabel2("three", nil, 0), 0, 0) + addWidget(vboxWidget) + + //Horizontal Layout + hboxWidget := widgets.NewQWidget(nil, 0) + hboxWidget.SetWindowTitle("Horizontal Layout") + + hbox := widgets.NewQHBoxLayout2(hboxWidget) + hbox.AddWidget(widgets.NewQLabel2("one", nil, 0), 0, 0) + hbox.AddWidget(widgets.NewQLabel2("two", nil, 0), 0, 0) + hbox.AddWidget(widgets.NewQLabel2("three", nil, 0), 0, 0) + addWidget(hboxWidget) + + //Grid Layout + gridWidget := widgets.NewQWidget(nil, 0) + gridWidget.SetWindowTitle("Grid Layout") + + grid := widgets.NewQGridLayout(gridWidget) + for row := 0; row < 4; row++ { + for column := 0; column < 4; column++ { + grid.AddWidget(widgets.NewQLabel2(fmt.Sprintf("[%v:%v]", row, column), nil, 0), row, column, core.Qt__AlignCenter) + } + } + addWidget(gridWidget) + + //Form layout + formWidget := widgets.NewQWidget(nil, 0) + formWidget.SetWindowTitle("Form Layout") + + form := widgets.NewQFormLayout(formWidget) + for row := 0; row < 3; row++ { + form.AddRow3(fmt.Sprintf("label %v", row), widgets.NewQLineEdit2(fmt.Sprintf("field %v", row), nil)) + } + addWidget(formWidget) + +} diff --git a/internal/examples/common/widgets/main.go b/internal/examples/common/widgets/main.go new file mode 100644 index 00000000..2e75b5fc --- /dev/null +++ b/internal/examples/common/widgets/main.go @@ -0,0 +1,58 @@ +package main + +import ( + "os" + + "github.com/therecipe/qt/core" + "github.com/therecipe/qt/widgets" +) + +var ( + centralLayout *widgets.QGridLayout + centralLayoutRow int + centralLayoutColumn int +) + +func main() { + widgets.NewQApplication(len(os.Args), os.Args) + + mainWindow := widgets.NewQMainWindow(nil, 0) + mainWindow.SetWindowTitle("Common Widgets") + + scrollWidget := widgets.NewQScrollArea(nil) + + centralWidget := widgets.NewQWidget(nil, 0) + centralLayout = widgets.NewQGridLayout(centralWidget) + + layouts() + buttons() + itemViews() + itemWidgets() + containers() + inputWidgets() + displayWidgets() + + scrollWidget.SetWidget(centralWidget) + + mainWindow.SetCentralWidget(scrollWidget) + mainWindow.ShowMaximized() + + widgets.QApplication_Exec() +} + +func addWidget(widget widgets.QWidget_ITF) { + + if centralLayoutColumn > 6 { + centralLayoutColumn = 0 + centralLayoutRow++ + } + + wrappedWidget := widgets.NewQGroupBox2(widget.QWidget_PTR().WindowTitle(), nil) + wrappedWidgetLayout := widgets.NewQVBoxLayout2(wrappedWidget) + wrappedWidgetLayout.AddWidget(widget, 0, core.Qt__AlignCenter) + wrappedWidget.SetFixedSize2(250, 250) + + centralLayout.AddWidget(wrappedWidget, centralLayoutRow, centralLayoutColumn, core.Qt__AlignCenter) + + centralLayoutColumn++ +} diff --git a/internal/examples/common/widgets/qml/stub.qml b/internal/examples/common/widgets/qml/stub.qml new file mode 100644 index 00000000..b382eaab --- /dev/null +++ b/internal/examples/common/widgets/qml/stub.qml @@ -0,0 +1,7 @@ +import QtQuick 2.0 +import QtQuick.Layouts 1.3 +import QtQuick.Controls 1.4 + +Item {} + +//this file is just here to inform qtdeploy about the needed QML dependencies diff --git a/internal/examples/quick/dynamic/qml/dynamic.qml b/internal/examples/quick/dynamic/qml/dynamic.qml index 78999235..e76c4f5a 100644 --- a/internal/examples/quick/dynamic/qml/dynamic.qml +++ b/internal/examples/quick/dynamic/qml/dynamic.qml @@ -3,4 +3,4 @@ import QtQuick.Controls 2.0 Item {} -//This file is just here to inform qtdeploy about the needed QML dependencies +//this file is just here to inform qtdeploy about the needed QML dependencies diff --git a/internal/examples/quick/errors/main.go b/internal/examples/quick/errors/main.go new file mode 100644 index 00000000..1a0e6079 --- /dev/null +++ b/internal/examples/quick/errors/main.go @@ -0,0 +1,40 @@ +package main + +import ( + "fmt" + "os" + + "github.com/therecipe/qt/core" + "github.com/therecipe/qt/qml" + "github.com/therecipe/qt/quick" + "github.com/therecipe/qt/widgets" +) + +//this example demonstrates one possible way to deal with qml errors/warnings +//therefore the qml file does contain errors and will NOT work properly + +func main() { + + widgets.NewQApplication(len(os.Args), os.Args) + + view := quick.NewQQuickView(nil) + view.Engine().ConnectWarnings(func(warnings []*qml.QQmlError) { + for _, w := range warnings { + fmt.Println("warning:", w.ToString()) + } + os.Exit(1) + }) + + view.SetResizeMode(quick.QQuickView__SizeViewToRootObject) + view.SetSource(core.NewQUrl3("qrc:///qml/view.qml", 0)) + view.Show() + + if errors := view.Errors(); len(errors) != 0 { + for _, e := range errors { + fmt.Println("error:", e.ToString()) + } + os.Exit(1) + } + + widgets.QApplication_Exec() +} diff --git a/internal/examples/quick/errors/qml/view.qml b/internal/examples/quick/errors/qml/view.qml new file mode 100644 index 00000000..6048fc38 --- /dev/null +++ b/internal/examples/quick/errors/qml/view.qml @@ -0,0 +1,9 @@ +import QtQuick 2.0 + +Rectangle { + width: 300 + height: 300 + color: "green" + + someError +}