Go-Qt5开发之移动鼠标发出信号(42)

Go-Qt5开发之移动鼠标发出信号

案例介绍

  • 重写鼠标移动事件;
  • 发送信号,传递参数;

demo.go

package main

import (
	"errors"
	"fmt"
	"github.com/therecipe/qt"
	"github.com/therecipe/qt/core"
	"github.com/therecipe/qt/gui"
	"github.com/therecipe/qt/widgets"
	"os"
	"unsafe"
)

/* 重写鼠标移动事件; 发送信号,传递参数; */

type UIMainWindow struct {
	CentralWidget *widgets.QWidget
	Menubar       *widgets.QMenuBar
	Statusbar     *widgets.QStatusBar
	PushButton1   *widgets.QPushButton
	PushButton2   *widgets.QPushButton
	GoSignal      GoSignal
}

type GoSignal struct {
	core.QObject
	a interface{}
}

func (g *GoSignal) ConnectGoSignal(a interface{}) {
	if !qt.ExistsSignal(g.Pointer(), "goSignal") {
		g.a = a
		qt.ConnectSignal(g.Pointer(), "goSignal", unsafe.Pointer(&a))
	}

	// 会直接执行
	//g.ConnectSignal(g.ConnectGoSignal, a, core.Qt__AutoConnection)
}

func (g *GoSignal) Emit() (err error) {
	err = nil
	if signal := qt.LendSignal(g.Pointer(), "goSignal"); signal != nil {
		func() {
			g.a.(func())()
		}()
		qt.ConnectSignal(g.Pointer(), "goSignal", unsafe.Pointer(&g.a))
	} else {
		err = errors.New("not ExistsSignal -> goSignal")
	}
	return err
}

func (g *GoSignal) Emit2(args interface{}) (err error) {
	err = nil
	if signal := qt.LendSignal(g.Pointer(), "goSignal"); signal != nil {
		func() {
			g.a.(func(args interface{}))(args)
		}()
		qt.ConnectSignal(g.Pointer(), "goSignal", unsafe.Pointer(&g.a))
	} else {
		err = errors.New("not ExistsSignal -> goSignal")
	}
	return err
}

func (w *UIMainWindow) SetupUI(MainWindow *widgets.QMainWindow) {
	MainWindow.SetObjectName("MainWindow")
	// 设置窗口的标题
	MainWindow.SetWindowTitle("Qt 教程")
	// 设置窗口的位置和大小
	MainWindow.SetGeometry2(300, 300, 300, 220)
	// 设置窗口的图标
	MainWindow.SetWindowIcon(gui.NewQIcon5("images/app.ico"))

	// 窗口居中显示
	w.Center(MainWindow)

	// 中心窗口组件载体
	w.CentralWidget = widgets.NewQWidget(MainWindow, core.Qt__Widget)
	// w.CentralWidget.SetGeometry(core.NewQRect4(300, 300, 300, 220))
	w.CentralWidget.SetGeometry2(0, 0, 300, 220)
	MainWindow.SetCentralWidget(w.CentralWidget)

	// 状态栏
	w.Statusbar = widgets.NewQStatusBar(MainWindow)
	w.Statusbar.SetObjectName("Statusbar")
	MainWindow.SetStatusBar(w.Statusbar)

	// 自定义信号
	w.GoSignal = GoSignal{}
	w.GoSignal.ConnectGoSignal(w.getData)

	// 鼠标事件处理器重写
	MainWindow.ConnectMoveEvent(w.MoveEvent)
}

func (w *UIMainWindow) MoveEvent(event *gui.QMoveEvent) {
	// 发送信号: 坐标
	//event.Pos().X(),event.Pos().Y()
	_ = w.GoSignal.Emit2([]interface{}{event.Pos().X(), event.Pos().Y()})
	//fmt.Println("getData: ", event.Pos().X(),event.Pos().Y())
}

func (w *UIMainWindow) getData(args interface{}) {
	fmt.Println("getData: ", args)
}

// 控制窗口显示在屏幕中心的方法
func  (w *UIMainWindow) Center(MainWindow *widgets.QMainWindow) {
	// 得到窗口
	qr := MainWindow.FrameGeometry()

	// 得到屏幕中心点
	cp := widgets.NewQDesktopWidget().AvailableGeometry2(MainWindow).Center()
	// 显示到屏幕中心
	qr.MoveCenter(cp)
	MainWindow.Move(qr.TopLeft())
}

func (w *UIMainWindow) RetranslateUi(MainWindow *widgets.QMainWindow) {
	_translate := core.QCoreApplication_Translate
	MainWindow.SetWindowTitle(_translate("MainWindow", "QT 教程", "", -1))
}

func main() {
	// 建立一个应用程序对象
	// sys.argv参数是一个列表,从命令行输入参数
	widgets.NewQApplication(len(os.Args), os.Args)

	// 初始化窗口
	MainWindow := widgets.NewQMainWindow(nil, 0)

	uiMain := UIMainWindow{}
	uiMain.SetupUI(MainWindow)
	uiMain.RetranslateUi(MainWindow)

	// 显示组件
	MainWindow.Show()

	// 确保应用程序干净的退出
	widgets.QApplication_Exec()
}