use cpp_core::{Ptr, Ref, StaticUpcast}; use qt_core::{qs, slot, QBox, QObject, QString, SlotNoArgs, SlotOfBool, SlotOfQString}; use qt_widgets::{ QApplication, QCheckBox, QHBoxLayout, QLineEdit, QPushButton, QVBoxLayout, QWidget, }; use std::rc::Rc; struct Form { win: QBox, ed: QBox, checkbox: QBox, button: QBox, } impl StaticUpcast for Form { unsafe fn static_upcast(ptr: Ptr) -> Ptr { ptr.win.as_ptr().static_upcast() } } impl Form { fn new() -> Rc
{ unsafe { let win = QWidget::new_0a(); win.set_fixed_size_2a(400, 300); let vbox = QVBoxLayout::new_1a(&win); let ed = QLineEdit::new(); ed.set_placeholder_text(&qs("Enter name")); vbox.add_widget(&ed); let hbox = QHBoxLayout::new_0a(); vbox.add_layout_1a(&hbox); let checkbox = QCheckBox::new(); hbox.add_widget(&checkbox); checkbox.set_text(&qs("Check me!")); let button = QPushButton::new(); hbox.add_widget(&button); button.set_text(&qs("Greet!")); win.show(); let this = Rc::new(Self { win, ed, checkbox, button, }); this.init(); this } } unsafe fn init(self: &Rc) { self.ed .text_changed() .connect(&self.slot_on_lineedit_text_changed()); self.button .pressed() .connect(&self.slot_on_button_pressed()); self.checkbox .clicked() .connect(&self.slot_on_checkbox_clicked()); } #[slot(SlotNoArgs)] unsafe fn on_button_pressed(self: &Rc) { println!("Hello {}", self.ed.text().to_std_string()); } #[slot(SlotOfBool)] unsafe fn on_checkbox_clicked(self: &Rc, checked: bool) { println!( "{} is {}checked", self.checkbox.text().to_std_string(), if checked { "" } else { "un" } ); } #[slot(SlotOfQString)] unsafe fn on_lineedit_text_changed(self: &Rc, txt: Ref) { println!("current lineedit text: {}", txt.to_std_string()); } } fn main() { QApplication::init(|_| unsafe { let _form = Form::new(); QApplication::exec() }) }