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()
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章