Files
TransPyC/includes/vqt6/__init__.vp
T

1802 lines
56 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ============================================================
# vqt6 — Viper 的 Qt6 绑定包
#
# 公共 Pythonic API(基于 C 桥接层)
# 用户用法:
# import vqt6
# app = vqt6.QApplication([])
# win = vqt6.QWidget()
# win.setWindowTitle("Hello")
# win.show()
# app.exec()
# ============================================================
import t
import stdlib
from stdint import *
from vqt6._types import *
from vqt6._qtcore import *
from vqt6._qtwidgets import *
from vqt6._qtgui import *
from vqt6._qtnetwork import *
# ============================================================
# 高级 API 类(Pythonic 包装,不透明指针)
# ============================================================
# ============================================================
# 模块级 helper:QWidget 基础操作(各控件类复用)
# ============================================================
def _w_show(ptr: t.CPtr):
vqt6_qwidget_show(ptr)
def _w_hide(ptr: t.CPtr):
vqt6_qwidget_hide(ptr)
def _w_close(ptr: t.CPtr) -> int:
return vqt6_qwidget_close(ptr)
def _w_set_geometry(ptr: t.CPtr, x: int, y: int, w: int, h: int):
vqt6_qwidget_set_geometry(ptr, x, y, w, h)
def _w_resize(ptr: t.CPtr, w: int, h: int):
vqt6_qwidget_resize(ptr, w, h)
def _w_move(ptr: t.CPtr, x: int, y: int):
vqt6_qwidget_move(ptr, x, y)
def _w_set_enabled(ptr: t.CPtr, enabled: int):
vqt6_qwidget_set_enabled(ptr, enabled)
def _w_set_visible(ptr: t.CPtr, visible: int):
vqt6_qwidget_set_visible(ptr, visible)
def _w_is_visible(ptr: t.CPtr) -> int:
return vqt6_qwidget_is_visible(ptr)
def _w_set_window_title(ptr: t.CPtr, title: str):
qs: QtStringPtr = vqt6_qstring_create(title)
vqt6_qwidget_set_window_title(ptr, qs)
vqt6_qstring_free(qs)
def _w_set_tool_tip(ptr: t.CPtr, tip: str):
qs: QtStringPtr = vqt6_qstring_create(tip)
vqt6_qwidget_set_tool_tip(ptr, qs)
vqt6_qstring_free(qs)
def _w_text_of(qstr: QtStringPtr) -> str:
"""QtStringPtr → Viper str(复制到 malloc 缓冲)"""
buf: bytes = stdlib.malloc(1024)
vqt6_qstring_to_utf8(qstr, buf, 1024)
s: str = buf
vqt6_qstring_free(qstr)
return s
# ============================================================
# 树状控件统计助手(返回 int,规避跨模块 FFI 返回指针)
# 叶子勾选态: 0=未选 1=半选 2=选中
# ============================================================
def qtree_checked_count(tw: QtTreeWidgetPtr) -> int:
"""统计被勾选的叶子节点数"""
n: int = 0
gi: int = 0
top_n: int = vqt6_qtreewidget_top_level_item_count(tw)
while gi < top_n:
g: QtTreeWidgetItemPtr = vqt6_qtreewidget_top_level_item(tw, gi)
ci: int = 0
cn: int = vqt6_qtreewidgetitem_child_count(g)
while ci < cn:
it: QtTreeWidgetItemPtr = vqt6_qtreewidgetitem_child(g, ci)
if vqt6_qtreewidgetitem_check_state(it) == 2:
n += 1
ci += 1
gi += 1
return n
def qtree_checked_size(tw: QtTreeWidgetPtr) -> int:
"""统计被勾选叶子节点的磁盘占用合计(MB)"""
mb: int = 0
gi: int = 0
top_n: int = vqt6_qtreewidget_top_level_item_count(tw)
while gi < top_n:
g: QtTreeWidgetItemPtr = vqt6_qtreewidget_top_level_item(tw, gi)
ci: int = 0
cn: int = vqt6_qtreewidgetitem_child_count(g)
while ci < cn:
it: QtTreeWidgetItemPtr = vqt6_qtreewidgetitem_child(g, ci)
if vqt6_qtreewidgetitem_check_state(it) == 2:
mb += vqt6_qtreewidgetitem_data_int(it)
ci += 1
gi += 1
return mb
def qtree_click_toggle(tw: QtTreeWidgetPtr):
"""点击带子节点的当前行 → 展开/折叠"""
cur: QtTreeWidgetItemPtr = vqt6_qtreewidget_current_item(tw)
if cur is None:
return
if vqt6_qtreewidgetitem_child_count(cur) > 0:
ex: int = vqt6_qtreewidgetitem_is_expanded(cur)
vqt6_qtreewidgetitem_set_expanded(cur, 1 - ex)
@t.NoVTable
class QApplication:
"""QApplication 包装(不透明指针)"""
_ptr: QtAppPtr
def __init__(self, argv: list[str] | t.CPtr):
# 把 argv 转换为 argc/argv 数组
argc: t.CInt = 1
# Viper 端 argv 是 c_char_p 指针数组
# 这里仅传空 argv,避免 C ABI 复杂性
argv_ptr: t.CPtr = t.CPtr(0)
self._ptr = vqt6_qapplication_create(argc, argv_ptr)
if self._ptr is None:
raise RuntimeError("Failed to create QApplication")
def exec(self) -> int:
return vqt6_qapplication_exec(self._ptr)
def quit(self):
vqt6_qapplication_quit(self._ptr)
def exit(self, code: int):
vqt6_qapplication_exit(self._ptr, code)
def process_events(self):
vqt6_qapplication_process_events(self._ptr)
def desktop_width(self) -> int:
return vqt6_qapplication_desktop_width(self._ptr)
def desktop_height(self) -> int:
return vqt6_qapplication_desktop_height(self._ptr)
@t.NoVTable
class QWidget:
"""QWidget 包装"""
_ptr: QtWidgetPtr
def __init__(self, parent: "QWidget | None" = None):
if parent is not None and parent._ptr is not None:
self._ptr = vqt6_qwidget_create_with_parent(parent._ptr)
else:
self._ptr = vqt6_qwidget_create()
if self._ptr is None:
raise RuntimeError("Failed to create QWidget")
def show(self):
vqt6_qwidget_show(self._ptr)
def hide(self):
vqt6_qwidget_hide(self._ptr)
def close(self) -> int:
return vqt6_qwidget_close(self._ptr)
def setWindowTitle(self, title: str):
title_qs: QtStringPtr = vqt6_qstring_create(title)
vqt6_qwidget_set_window_title(self._ptr, title_qs)
vqt6_qstring_free(title_qs)
def windowTitle(self) -> str:
result: QtStringPtr = vqt6_qwidget_window_title(self._ptr)
buf: bytes = stdlib.malloc(1024)
vqt6_qstring_to_utf8(result, buf, 1024)
s: str = buf
vqt6_qstring_free(result)
return s
def resize(self, w: int, h: int):
vqt6_qwidget_resize(self._ptr, w, h)
def move(self, x: int, y: int):
vqt6_qwidget_move(self._ptr, x, y)
def setGeometry(self, x: int, y: int, w: int, h: int):
vqt6_qwidget_set_geometry(self._ptr, x, y, w, h)
def setEnabled(self, enabled: int):
vqt6_qwidget_set_enabled(self._ptr, enabled)
def setVisible(self, visible: int):
vqt6_qwidget_set_visible(self._ptr, visible)
def isVisible(self) -> int:
return vqt6_qwidget_is_visible(self._ptr)
def setToolTip(self, tip: str):
tip_qs: QtStringPtr = vqt6_qstring_create(tip)
vqt6_qwidget_set_tool_tip(self._ptr, tip_qs)
vqt6_qstring_free(tip_qs)
def setStyleSheet(self, qss: str):
vqt6_qwidget_set_stylesheet_utf8(self._ptr, qss)
@t.NoVTable
class QLabel:
"""QLabel 包装"""
_ptr: QtLabelPtr
def __init__(self, text: str = "", parent: "QWidget | None" = None):
text_qs: QtStringPtr = vqt6_qstring_create(text)
if parent is not None and parent._ptr is not None:
self._ptr = vqt6_qlabel_create_with_text_parent(text_qs, parent._ptr)
elif text_qs is not None:
self._ptr = vqt6_qlabel_create_with_text(text_qs)
else:
self._ptr = vqt6_qlabel_create()
vqt6_qstring_free(text_qs)
if self._ptr is None:
raise RuntimeError("Failed to create QLabel")
def setText(self, text: str):
text_qs: QtStringPtr = vqt6_qstring_create(text)
vqt6_qlabel_set_text(self._ptr, text_qs)
vqt6_qstring_free(text_qs)
def text(self) -> str:
result: QtStringPtr = vqt6_qlabel_text(self._ptr)
buf: bytes = stdlib.malloc(1024)
vqt6_qstring_to_utf8(result, buf, 1024)
s: str = buf
vqt6_qstring_free(result)
return s
def setAlignment(self, alignment: int):
vqt6_qlabel_set_alignment(self._ptr, alignment)
def setStyleSheet(self, qss: str):
vqt6_qwidget_set_stylesheet_utf8(self._ptr, qss)
@t.NoVTable
class QPushButton:
"""QPushButton 包装"""
_ptr: QtPushButtonPtr
def __init__(self, text: str = "", parent: "QWidget | None" = None):
text_qs: QtStringPtr = vqt6_qstring_create(text)
if parent is not None and parent._ptr is not None:
self._ptr = vqt6_qpushbutton_create_with_text_parent(text_qs, parent._ptr)
elif text_qs is not None:
self._ptr = vqt6_qpushbutton_create_with_text(text_qs)
else:
self._ptr = vqt6_qpushbutton_create()
vqt6_qstring_free(text_qs)
if self._ptr is None:
raise RuntimeError("Failed to create QPushButton")
def setText(self, text: str):
text_qs: QtStringPtr = vqt6_qstring_create(text)
vqt6_qpushbutton_set_text(self._ptr, text_qs)
vqt6_qstring_free(text_qs)
def text(self) -> str:
result: QtStringPtr = vqt6_qpushbutton_text(self._ptr)
buf: bytes = stdlib.malloc(1024)
vqt6_qstring_to_utf8(result, buf, 1024)
s: str = buf
vqt6_qstring_free(result)
return s
def click(self):
vqt6_qpushbutton_click(self._ptr)
def setEnabled(self, enabled: int):
vqt6_qwidget_set_enabled(self._ptr, enabled)
def setCheckable(self, checkable: int):
vqt6_qpushbutton_set_checkable(self._ptr, checkable)
def isCheckable(self) -> int:
return vqt6_qpushbutton_is_checkable(self._ptr)
def setChecked(self, checked: int):
vqt6_qpushbutton_set_checked(self._ptr, checked)
def isChecked(self) -> int:
return vqt6_qpushbutton_is_checked(self._ptr)
def setFlat(self, flat: int):
vqt6_qpushbutton_set_flat(self._ptr, flat)
# 回调(cb 传 Viper 模块级函数,签名 def cb(slot_id: int, data: t.CPtr))
def clicked(self, cb: bytes, data: bytes = 0):
vqt6_qpushbutton_connect_clicked(self._ptr, cb, data)
def toggled(self, cb: bytes, data: bytes = 0):
vqt6_qpushbutton_connect_toggled(self._ptr, cb, data)
# ============================================================
# 窗口:QMainWindow / QDialog
# ============================================================
@t.NoVTable
class QMainWindow:
"""QMainWindow 包装"""
_ptr: QtMainWindowPtr
def __init__(self, parent: "QWidget | None" = None):
if parent is not None and parent._ptr is not None:
self._ptr = vqt6_qmainwindow_create_with_parent(parent._ptr)
else:
self._ptr = vqt6_qmainwindow_create()
if self._ptr is None:
raise RuntimeError("Failed to create QMainWindow")
def setCentralWidget(self, w: t.CPtr):
vqt6_qmainwindow_set_central_widget(self._ptr, w)
def menuBar(self) -> "QMenuBar":
mb_ptr: QtMenuBarPtr = vqt6_qmainwindow_menu_bar(self._ptr)
mb = QMenuBar()
mb._ptr = mb_ptr
return mb
def setMenuBar(self, mb: t.CPtr):
vqt6_qmainwindow_set_menu_bar(self._ptr, mb)
def statusBar(self) -> "QStatusBar":
sb_ptr: QtStatusBarPtr = vqt6_qmainwindow_status_bar(self._ptr)
sb = QStatusBar()
sb._ptr = sb_ptr
return sb
def addToolBar(self, tb: t.CPtr):
vqt6_qmainwindow_add_tool_bar(self._ptr, tb)
def show(self):
_w_show(self._ptr)
def hide(self):
_w_hide(self._ptr)
def close(self) -> int:
return _w_close(self._ptr)
def resize(self, w: int, h: int):
_w_resize(self._ptr, w, h)
def move(self, x: int, y: int):
_w_move(self._ptr, x, y)
def setGeometry(self, x: int, y: int, w: int, h: int):
_w_set_geometry(self._ptr, x, y, w, h)
def setWindowTitle(self, title: str):
_w_set_window_title(self._ptr, title)
def setEnabled(self, enabled: int):
_w_set_enabled(self._ptr, enabled)
def setToolTip(self, tip: str):
_w_set_tool_tip(self._ptr, tip)
@t.NoVTable
class QDialog:
"""QDialog 包装"""
_ptr: QtDialogPtr
def __init__(self, parent: "QWidget | None" = None):
if parent is not None and parent._ptr is not None:
self._ptr = vqt6_qdialog_create_with_parent(parent._ptr)
else:
self._ptr = vqt6_qdialog_create()
if self._ptr is None:
raise RuntimeError("Failed to create QDialog")
def exec(self) -> int:
return vqt6_qdialog_exec(self._ptr)
def accept(self):
vqt6_qdialog_accept(self._ptr)
def reject(self):
vqt6_qdialog_reject(self._ptr)
def setModal(self, modal: int):
vqt6_qdialog_set_modal(self._ptr, modal)
def isModal(self) -> int:
return vqt6_qdialog_is_modal(self._ptr)
def setResult(self, result: int):
vqt6_qdialog_set_result(self._ptr, result)
def result(self) -> int:
return vqt6_qdialog_result(self._ptr)
def show(self):
_w_show(self._ptr)
def hide(self):
_w_hide(self._ptr)
def close(self) -> int:
return _w_close(self._ptr)
def resize(self, w: int, h: int):
_w_resize(self._ptr, w, h)
def setGeometry(self, x: int, y: int, w: int, h: int):
_w_set_geometry(self._ptr, x, y, w, h)
def setWindowTitle(self, title: str):
_w_set_window_title(self._ptr, title)
# ============================================================
# 输入控件:QLineEdit / QCheckBox / QRadioButton
# ============================================================
@t.NoVTable
class QLineEdit:
"""QLineEdit 包装"""
_ptr: QtLineEditPtr
def __init__(self, text: str = "", parent: "QWidget | None" = None):
qs: QtStringPtr = vqt6_qstring_create(text)
if parent is not None and parent._ptr is not None:
self._ptr = vqt6_qlineedit_create_with_text_parent(qs, parent._ptr)
else:
self._ptr = vqt6_qlineedit_create_with_text(qs)
vqt6_qstring_free(qs)
if self._ptr is None:
raise RuntimeError("Failed to create QLineEdit")
def setText(self, text: str):
qs: QtStringPtr = vqt6_qstring_create(text)
vqt6_qlineedit_set_text(self._ptr, qs)
vqt6_qstring_free(qs)
def text(self) -> str:
return _w_text_of(vqt6_qlineedit_text(self._ptr))
def setPlaceholderText(self, text: str):
qs: QtStringPtr = vqt6_qstring_create(text)
vqt6_qlineedit_set_placeholder_text(self._ptr, qs)
vqt6_qstring_free(qs)
def setReadOnly(self, ro: int):
vqt6_qlineedit_set_read_only(self._ptr, ro)
def isReadOnly(self) -> int:
return vqt6_qlineedit_is_read_only(self._ptr)
def setMaxLength(self, max_len: int):
vqt6_qlineedit_set_max_length(self._ptr, max_len)
def selectAll(self):
vqt6_qlineedit_select_all(self._ptr)
def clear(self):
vqt6_qlineedit_clear(self._ptr)
def textChanged(self, cb: bytes, data: bytes = 0):
vqt6_qlineedit_connect_text_changed(self._ptr, cb, data)
def show(self):
_w_show(self._ptr)
def hide(self):
_w_hide(self._ptr)
def resize(self, w: int, h: int):
_w_resize(self._ptr, w, h)
def move(self, x: int, y: int):
_w_move(self._ptr, x, y)
def setGeometry(self, x: int, y: int, w: int, h: int):
_w_set_geometry(self._ptr, x, y, w, h)
def setEnabled(self, enabled: int):
_w_set_enabled(self._ptr, enabled)
@t.NoVTable
class QCheckBox:
"""QCheckBox 包装"""
_ptr: QtCheckBoxPtr
def __init__(self, text: str = "", parent: "QWidget | None" = None):
qs: QtStringPtr = vqt6_qstring_create(text)
if parent is not None and parent._ptr is not None:
self._ptr = vqt6_qcheckbox_create_with_text_parent(qs, parent._ptr)
else:
self._ptr = vqt6_qcheckbox_create_with_text(qs)
vqt6_qstring_free(qs)
if self._ptr is None:
raise RuntimeError("Failed to create QCheckBox")
def setText(self, text: str):
qs: QtStringPtr = vqt6_qstring_create(text)
vqt6_qcheckbox_set_text(self._ptr, qs)
vqt6_qstring_free(qs)
def text(self) -> str:
return _w_text_of(vqt6_qcheckbox_text(self._ptr))
def setChecked(self, checked: int):
vqt6_qcheckbox_set_checked(self._ptr, checked)
def isChecked(self) -> int:
return vqt6_qcheckbox_is_checked(self._ptr)
def setTristate(self, tristate: int):
vqt6_qcheckbox_set_tristate(self._ptr, tristate)
def isTristate(self) -> int:
return vqt6_qcheckbox_is_tristate(self._ptr)
def toggled(self, cb: bytes, data: bytes = 0):
vqt6_qcheckbox_connect_toggled(self._ptr, cb, data)
def stateChanged(self, cb: bytes, data: bytes = 0):
vqt6_qcheckbox_connect_state_changed(self._ptr, cb, data)
def show(self):
_w_show(self._ptr)
def hide(self):
_w_hide(self._ptr)
def setGeometry(self, x: int, y: int, w: int, h: int):
_w_set_geometry(self._ptr, x, y, w, h)
def resize(self, w: int, h: int):
_w_resize(self._ptr, w, h)
def move(self, x: int, y: int):
_w_move(self._ptr, x, y)
def setEnabled(self, enabled: int):
_w_set_enabled(self._ptr, enabled)
@t.NoVTable
class QRadioButton:
"""QRadioButton 包装"""
_ptr: QtRadioButtonPtr
def __init__(self, text: str = "", parent: "QWidget | None" = None):
qs: QtStringPtr = vqt6_qstring_create(text)
if parent is not None and parent._ptr is not None:
self._ptr = vqt6_qradiobutton_create_with_text_parent(qs, parent._ptr)
else:
self._ptr = vqt6_qradiobutton_create_with_text(qs)
vqt6_qstring_free(qs)
if self._ptr is None:
raise RuntimeError("Failed to create QRadioButton")
def setText(self, text: str):
qs: QtStringPtr = vqt6_qstring_create(text)
vqt6_qradiobutton_set_text(self._ptr, qs)
vqt6_qstring_free(qs)
def text(self) -> str:
return _w_text_of(vqt6_qradiobutton_text(self._ptr))
def setChecked(self, checked: int):
vqt6_qradiobutton_set_checked(self._ptr, checked)
def isChecked(self) -> int:
return vqt6_qradiobutton_is_checked(self._ptr)
def toggled(self, cb: bytes, data: bytes = 0):
vqt6_qradiobutton_connect_toggled(self._ptr, cb, data)
def show(self):
_w_show(self._ptr)
def hide(self):
_w_hide(self._ptr)
def setGeometry(self, x: int, y: int, w: int, h: int):
_w_set_geometry(self._ptr, x, y, w, h)
def resize(self, w: int, h: int):
_w_resize(self._ptr, w, h)
def move(self, x: int, y: int):
_w_move(self._ptr, x, y)
def setEnabled(self, enabled: int):
_w_set_enabled(self._ptr, enabled)
# ============================================================
# 选择控件:QComboBox / QSlider / QSpinBox / QProgressBar
# ============================================================
@t.NoVTable
class QComboBox:
"""QComboBox 包装"""
_ptr: QtComboBoxPtr
def __init__(self, parent: "QWidget | None" = None):
if parent is not None and parent._ptr is not None:
self._ptr = vqt6_qcombobox_create_with_parent(parent._ptr)
else:
self._ptr = vqt6_qcombobox_create()
if self._ptr is None:
raise RuntimeError("Failed to create QComboBox")
def addItem(self, text: str):
qs: QtStringPtr = vqt6_qstring_create(text)
vqt6_qcombobox_add_item(self._ptr, qs)
vqt6_qstring_free(qs)
def insertItem(self, index: int, text: str):
qs: QtStringPtr = vqt6_qstring_create(text)
vqt6_qcombobox_insert_item(self._ptr, index, qs)
vqt6_qstring_free(qs)
def removeItem(self, index: int):
vqt6_qcombobox_remove_item(self._ptr, index)
def clear(self):
vqt6_qcombobox_clear(self._ptr)
def count(self) -> int:
return vqt6_qcombobox_count(self._ptr)
def currentIndex(self) -> int:
return vqt6_qcombobox_current_index(self._ptr)
def setCurrentIndex(self, index: int):
vqt6_qcombobox_set_current_index(self._ptr, index)
def currentText(self) -> str:
return _w_text_of(vqt6_qcombobox_current_text(self._ptr))
def itemText(self, index: int) -> str:
return _w_text_of(vqt6_qcombobox_item_text(self._ptr, index))
def setEditable(self, editable: int):
vqt6_qcombobox_set_editable(self._ptr, editable)
def isEditable(self) -> int:
return vqt6_qcombobox_is_editable(self._ptr)
def currentIndexChanged(self, cb: bytes, data: bytes = 0):
vqt6_qcombobox_connect_current_index_changed(self._ptr, cb, data)
def show(self):
_w_show(self._ptr)
def hide(self):
_w_hide(self._ptr)
def setGeometry(self, x: int, y: int, w: int, h: int):
_w_set_geometry(self._ptr, x, y, w, h)
def resize(self, w: int, h: int):
_w_resize(self._ptr, w, h)
def move(self, x: int, y: int):
_w_move(self._ptr, x, y)
def setEnabled(self, enabled: int):
_w_set_enabled(self._ptr, enabled)
@t.NoVTable
class QSlider:
"""QSlider 包装"""
_ptr: QtSliderPtr
def __init__(self, orientation: int = QT_HORIZONTAL, parent: "QWidget | None" = None):
if parent is not None and parent._ptr is not None:
self._ptr = vqt6_qslider_create_with_orientation_parent(orientation, parent._ptr)
else:
self._ptr = vqt6_qslider_create_with_orientation(orientation)
if self._ptr is None:
raise RuntimeError("Failed to create QSlider")
def setValue(self, value: int):
vqt6_qslider_set_value(self._ptr, value)
def value(self) -> int:
return vqt6_qslider_value(self._ptr)
def setMinimum(self, min_val: int):
vqt6_qslider_set_minimum(self._ptr, min_val)
def setMaximum(self, max_val: int):
vqt6_qslider_set_maximum(self._ptr, max_val)
def setRange(self, min_val: int, max_val: int):
vqt6_qslider_set_range(self._ptr, min_val, max_val)
def setOrientation(self, orientation: int):
vqt6_qslider_set_orientation(self._ptr, orientation)
def orientation(self) -> int:
return vqt6_qslider_orientation(self._ptr)
def valueChanged(self, cb: bytes, data: bytes = 0):
vqt6_qslider_connect_value_changed(self._ptr, cb, data)
def show(self):
_w_show(self._ptr)
def hide(self):
_w_hide(self._ptr)
def setGeometry(self, x: int, y: int, w: int, h: int):
_w_set_geometry(self._ptr, x, y, w, h)
def resize(self, w: int, h: int):
_w_resize(self._ptr, w, h)
def move(self, x: int, y: int):
_w_move(self._ptr, x, y)
def setEnabled(self, enabled: int):
_w_set_enabled(self._ptr, enabled)
@t.NoVTable
class QSpinBox:
"""QSpinBox 包装"""
_ptr: QtSpinBoxPtr
def __init__(self, parent: "QWidget | None" = None):
if parent is not None and parent._ptr is not None:
self._ptr = vqt6_qspinbox_create_with_parent(parent._ptr)
else:
self._ptr = vqt6_qspinbox_create()
if self._ptr is None:
raise RuntimeError("Failed to create QSpinBox")
def value(self) -> int:
return vqt6_qspinbox_value(self._ptr)
def setValue(self, value: int):
vqt6_qspinbox_set_value(self._ptr, value)
def setMinimum(self, min_val: int):
vqt6_qspinbox_set_minimum(self._ptr, min_val)
def setMaximum(self, max_val: int):
vqt6_qspinbox_set_maximum(self._ptr, max_val)
def setRange(self, min_val: int, max_val: int):
vqt6_qspinbox_set_range(self._ptr, min_val, max_val)
def minimum(self) -> int:
return vqt6_qspinbox_minimum(self._ptr)
def maximum(self) -> int:
return vqt6_qspinbox_maximum(self._ptr)
def setPrefix(self, prefix: str):
qs: QtStringPtr = vqt6_qstring_create(prefix)
vqt6_qspinbox_set_prefix(self._ptr, qs)
vqt6_qstring_free(qs)
def setSuffix(self, suffix: str):
qs: QtStringPtr = vqt6_qstring_create(suffix)
vqt6_qspinbox_set_suffix(self._ptr, qs)
vqt6_qstring_free(qs)
def valueChanged(self, cb: bytes, data: bytes = 0):
vqt6_qspinbox_connect_value_changed(self._ptr, cb, data)
def show(self):
_w_show(self._ptr)
def hide(self):
_w_hide(self._ptr)
def setGeometry(self, x: int, y: int, w: int, h: int):
_w_set_geometry(self._ptr, x, y, w, h)
def resize(self, w: int, h: int):
_w_resize(self._ptr, w, h)
def move(self, x: int, y: int):
_w_move(self._ptr, x, y)
def setEnabled(self, enabled: int):
_w_set_enabled(self._ptr, enabled)
@t.NoVTable
class QProgressBar:
"""QProgressBar 包装"""
_ptr: QtProgressBarPtr
def __init__(self, parent: "QWidget | None" = None):
if parent is not None and parent._ptr is not None:
self._ptr = vqt6_qprogressbar_create_with_parent(parent._ptr)
else:
self._ptr = vqt6_qprogressbar_create()
if self._ptr is None:
raise RuntimeError("Failed to create QProgressBar")
def setValue(self, value: int):
vqt6_qprogressbar_set_value(self._ptr, value)
def value(self) -> int:
return vqt6_qprogressbar_value(self._ptr)
def setRange(self, min_val: int, max_val: int):
vqt6_qprogressbar_set_range(self._ptr, min_val, max_val)
def setMinimum(self, min_val: int):
vqt6_qprogressbar_set_minimum(self._ptr, min_val)
def setMaximum(self, max_val: int):
vqt6_qprogressbar_set_maximum(self._ptr, max_val)
def setFormat(self, format_str: str):
qs: QtStringPtr = vqt6_qstring_create(format_str)
vqt6_qprogressbar_set_format(self._ptr, qs)
vqt6_qstring_free(qs)
def setTextVisible(self, visible: int):
vqt6_qprogressbar_set_text_visible(self._ptr, visible)
def valueChanged(self, cb: bytes, data: bytes = 0):
vqt6_qprogressbar_connect_value_changed(self._ptr, cb, data)
def show(self):
_w_show(self._ptr)
def hide(self):
_w_hide(self._ptr)
def setGeometry(self, x: int, y: int, w: int, h: int):
_w_set_geometry(self._ptr, x, y, w, h)
def resize(self, w: int, h: int):
_w_resize(self._ptr, w, h)
def move(self, x: int, y: int):
_w_move(self._ptr, x, y)
def setEnabled(self, enabled: int):
_w_set_enabled(self._ptr, enabled)
# ============================================================
# 文本:QTextEdit / QPlainTextEdit
# ============================================================
@t.NoVTable
class QTextEdit:
"""QTextEdit 包装"""
_ptr: QtTextEditPtr
def __init__(self, parent: "QWidget | None" = None):
if parent is not None and parent._ptr is not None:
self._ptr = vqt6_qtextedit_create_with_parent(parent._ptr)
else:
self._ptr = vqt6_qtextedit_create()
if self._ptr is None:
raise RuntimeError("Failed to create QTextEdit")
def setPlainText(self, text: str):
qs: QtStringPtr = vqt6_qstring_create(text)
vqt6_qtextedit_set_plain_text(self._ptr, qs)
vqt6_qstring_free(qs)
def toPlainText(self) -> str:
return _w_text_of(vqt6_qtextedit_to_plain_text(self._ptr))
def setHtml(self, html: str):
qs: QtStringPtr = vqt6_qstring_create(html)
vqt6_qtextedit_set_html(self._ptr, qs)
vqt6_qstring_free(qs)
def append(self, text: str):
qs: QtStringPtr = vqt6_qstring_create(text)
vqt6_qtextedit_append(self._ptr, qs)
vqt6_qstring_free(qs)
def clear(self):
vqt6_qtextedit_clear(self._ptr)
def setReadOnly(self, ro: int):
vqt6_qtextedit_set_read_only(self._ptr, ro)
def isReadOnly(self) -> int:
return vqt6_qtextedit_is_read_only(self._ptr)
def show(self):
_w_show(self._ptr)
def hide(self):
_w_hide(self._ptr)
def setGeometry(self, x: int, y: int, w: int, h: int):
_w_set_geometry(self._ptr, x, y, w, h)
def resize(self, w: int, h: int):
_w_resize(self._ptr, w, h)
def move(self, x: int, y: int):
_w_move(self._ptr, x, y)
def setEnabled(self, enabled: int):
_w_set_enabled(self._ptr, enabled)
@t.NoVTable
class QPlainTextEdit:
"""QPlainTextEdit 包装"""
_ptr: QtPlainTextEditPtr
def __init__(self, parent: "QWidget | None" = None):
if parent is not None and parent._ptr is not None:
self._ptr = vqt6_qplaintextedit_create_with_parent(parent._ptr)
else:
self._ptr = vqt6_qplaintextedit_create()
if self._ptr is None:
raise RuntimeError("Failed to create QPlainTextEdit")
def setPlainText(self, text: str):
qs: QtStringPtr = vqt6_qstring_create(text)
vqt6_qplaintextedit_set_plain_text(self._ptr, qs)
vqt6_qstring_free(qs)
def toPlainText(self) -> str:
return _w_text_of(vqt6_qplaintextedit_to_plain_text(self._ptr))
def append(self, text: str):
qs: QtStringPtr = vqt6_qstring_create(text)
vqt6_qplaintextedit_append(self._ptr, qs)
vqt6_qstring_free(qs)
def clear(self):
vqt6_qplaintextedit_clear(self._ptr)
def setReadOnly(self, ro: int):
vqt6_qplaintextedit_set_read_only(self._ptr, ro)
def lineCount(self) -> int:
return vqt6_qplaintextedit_line_count(self._ptr)
def show(self):
_w_show(self._ptr)
def hide(self):
_w_hide(self._ptr)
def setGeometry(self, x: int, y: int, w: int, h: int):
_w_set_geometry(self._ptr, x, y, w, h)
def resize(self, w: int, h: int):
_w_resize(self._ptr, w, h)
def move(self, x: int, y: int):
_w_move(self._ptr, x, y)
def setEnabled(self, enabled: int):
_w_set_enabled(self._ptr, enabled)
# ============================================================
# 列表:QListWidget / QTabWidget / QStackedWidget
# ============================================================
@t.NoVTable
class QListWidget:
"""QListWidget 包装"""
_ptr: QtListWidgetPtr
def __init__(self, parent: "QWidget | None" = None):
if parent is not None and parent._ptr is not None:
self._ptr = vqt6_qlistwidget_create_with_parent(parent._ptr)
else:
self._ptr = vqt6_qlistwidget_create()
if self._ptr is None:
raise RuntimeError("Failed to create QListWidget")
def addItem(self, text: str):
qs: QtStringPtr = vqt6_qstring_create(text)
vqt6_qlistwidget_add_item(self._ptr, qs)
vqt6_qstring_free(qs)
def insertItem(self, row: int, text: str):
qs: QtStringPtr = vqt6_qstring_create(text)
vqt6_qlistwidget_insert_item(self._ptr, row, qs)
vqt6_qstring_free(qs)
def clear(self):
vqt6_qlistwidget_clear(self._ptr)
def count(self) -> int:
return vqt6_qlistwidget_count(self._ptr)
def currentRow(self) -> int:
return vqt6_qlistwidget_current_row(self._ptr)
def setCurrentRow(self, row: int):
vqt6_qlistwidget_set_current_row(self._ptr, row)
def currentItemText(self) -> str:
return _w_text_of(vqt6_qlistwidget_current_item_text(self._ptr))
def itemText(self, row: int) -> str:
return _w_text_of(vqt6_qlistwidget_item_text(self._ptr, row))
def setItemText(self, row: int, text: str):
qs: QtStringPtr = vqt6_qstring_create(text)
vqt6_qlistwidget_set_item_text(self._ptr, row, qs)
vqt6_qstring_free(qs)
def currentRowChanged(self, cb: bytes, data: bytes = 0):
vqt6_qlistwidget_connect_current_row_changed(self._ptr, cb, data)
def show(self):
_w_show(self._ptr)
def hide(self):
_w_hide(self._ptr)
def setGeometry(self, x: int, y: int, w: int, h: int):
_w_set_geometry(self._ptr, x, y, w, h)
def resize(self, w: int, h: int):
_w_resize(self._ptr, w, h)
def move(self, x: int, y: int):
_w_move(self._ptr, x, y)
def setEnabled(self, enabled: int):
_w_set_enabled(self._ptr, enabled)
@t.NoVTable
class QTreeWidgetItem:
"""QTreeWidgetItem 包装(树节点,勾选态 0=未选 2=选中)"""
_ptr: QtTreeWidgetItemPtr
def __init__(self, text: str = ""):
qs: QtStringPtr = vqt6_qstring_create(text)
self._ptr = vqt6_qtreewidgetitem_create(qs)
vqt6_qstring_free(qs)
if self._ptr is None:
raise RuntimeError("Failed to create QTreeWidgetItem")
def setText(self, text: str):
qs: QtStringPtr = vqt6_qstring_create(text)
vqt6_qtreewidgetitem_set_text(self._ptr, qs)
vqt6_qstring_free(qs)
def text(self) -> str:
return _w_text_of(vqt6_qtreewidgetitem_text(self._ptr))
def addChild(self, child: "QTreeWidgetItem"):
vqt6_qtreewidgetitem_add_child(self._ptr, child._ptr)
def childCount(self) -> int:
return vqt6_qtreewidgetitem_child_count(self._ptr)
def child(self, index: int) -> "QTreeWidgetItem":
it = QTreeWidgetItem()
it._ptr = vqt6_qtreewidgetitem_child(self._ptr, index)
return it
def setCheckable(self, checkable: int):
vqt6_qtreewidgetitem_set_checkable(self._ptr, checkable)
def setChecked(self, checked: int):
if checked != 0:
vqt6_qtreewidgetitem_set_check_state(self._ptr, 2)
else:
vqt6_qtreewidgetitem_set_check_state(self._ptr, 0)
def isChecked(self) -> int:
return vqt6_qtreewidgetitem_check_state(self._ptr)
def setSize(self, mb: int):
"""把磁盘占用(MB)存到节点 UserRole(统计用)"""
vqt6_qtreewidgetitem_set_data_int(self._ptr, mb)
def setExpanded(self, expanded: int):
vqt6_qtreewidgetitem_set_expanded(self._ptr, expanded)
def isExpanded(self) -> int:
return vqt6_qtreewidgetitem_is_expanded(self._ptr)
@t.NoVTable
class QTreeWidget:
"""QTreeWidget 包装"""
_ptr: QtTreeWidgetPtr
def __init__(self, parent: "QWidget | None" = None):
if parent is not None and parent._ptr is not None:
self._ptr = vqt6_qtreewidget_create_with_parent(parent._ptr)
else:
self._ptr = vqt6_qtreewidget_create()
if self._ptr is None:
raise RuntimeError("Failed to create QTreeWidget")
def addTopLevelItem(self, item: "QTreeWidgetItem"):
vqt6_qtreewidget_add_top_level_item(self._ptr, item._ptr)
def insertTopLevelItem(self, index: int, item: "QTreeWidgetItem"):
vqt6_qtreewidget_insert_top_level_item(self._ptr, index, item._ptr)
def topLevelItemCount(self) -> int:
return vqt6_qtreewidget_top_level_item_count(self._ptr)
def topLevelItem(self, index: int) -> "QTreeWidgetItem":
it = QTreeWidgetItem()
it._ptr = vqt6_qtreewidget_top_level_item(self._ptr, index)
return it
def currentItem(self) -> "QTreeWidgetItem":
it = QTreeWidgetItem()
it._ptr = vqt6_qtreewidget_current_item(self._ptr)
return it
def expandAll(self):
vqt6_qtreewidget_expand_all(self._ptr)
def collapseAll(self):
vqt6_qtreewidget_collapse_all(self._ptr)
def setHeaderHidden(self, hidden: int):
vqt6_qtreewidget_set_header_hidden(self._ptr, hidden)
def setColumnCount(self, count: int):
vqt6_qtreewidget_set_column_count(self._ptr, count)
def setItemExpanded(self, item: "QTreeWidgetItem", expanded: int):
vqt6_qtreewidget_set_item_expanded(self._ptr, item._ptr, expanded)
def itemChanged(self, cb: bytes, data: bytes = 0):
vqt6_qtreewidget_connect_item_changed(self._ptr, cb, data)
def itemClicked(self, cb: bytes, data: bytes = 0):
vqt6_qtreewidget_connect_item_clicked(self._ptr, cb, data)
def show(self):
_w_show(self._ptr)
def hide(self):
_w_hide(self._ptr)
def setGeometry(self, x: int, y: int, w: int, h: int):
_w_set_geometry(self._ptr, x, y, w, h)
def resize(self, w: int, h: int):
_w_resize(self._ptr, w, h)
def move(self, x: int, y: int):
_w_move(self._ptr, x, y)
def setEnabled(self, enabled: int):
_w_set_enabled(self._ptr, enabled)
@t.NoVTable
class QTabWidget:
"""QTabWidget 包装"""
_ptr: QtTabWidgetPtr
def __init__(self, parent: "QWidget | None" = None):
if parent is not None and parent._ptr is not None:
self._ptr = vqt6_qtabwidget_create_with_parent(parent._ptr)
else:
self._ptr = vqt6_qtabwidget_create()
if self._ptr is None:
raise RuntimeError("Failed to create QTabWidget")
def addTab(self, w: t.CPtr, label: str) -> int:
qs: QtStringPtr = vqt6_qstring_create(label)
idx: int = vqt6_qtabwidget_add_tab(self._ptr, w, qs)
vqt6_qstring_free(qs)
return idx
def removeTab(self, index: int):
vqt6_qtabwidget_remove_tab(self._ptr, index)
def count(self) -> int:
return vqt6_qtabwidget_count(self._ptr)
def currentIndex(self) -> int:
return vqt6_qtabwidget_current_index(self._ptr)
def setCurrentIndex(self, index: int):
vqt6_qtabwidget_set_current_index(self._ptr, index)
def tabText(self, index: int) -> str:
return _w_text_of(vqt6_qtabwidget_tab_text(self._ptr, index))
def setTabText(self, index: int, text: str):
qs: QtStringPtr = vqt6_qstring_create(text)
vqt6_qtabwidget_set_tab_text(self._ptr, index, qs)
vqt6_qstring_free(qs)
def currentChanged(self, cb: bytes, data: bytes = 0):
vqt6_qtabwidget_connect_current_changed(self._ptr, cb, data)
def show(self):
_w_show(self._ptr)
def hide(self):
_w_hide(self._ptr)
def setGeometry(self, x: int, y: int, w: int, h: int):
_w_set_geometry(self._ptr, x, y, w, h)
def resize(self, w: int, h: int):
_w_resize(self._ptr, w, h)
def move(self, x: int, y: int):
_w_move(self._ptr, x, y)
def setEnabled(self, enabled: int):
_w_set_enabled(self._ptr, enabled)
@t.NoVTable
class QStackedWidget:
"""QStackedWidget 包装"""
_ptr: QtStackedWidgetPtr
def __init__(self, parent: "QWidget | None" = None):
if parent is not None and parent._ptr is not None:
self._ptr = vqt6_qstackedwidget_create_with_parent(parent._ptr)
else:
self._ptr = vqt6_qstackedwidget_create()
if self._ptr is None:
raise RuntimeError("Failed to create QStackedWidget")
def addWidget(self, w: t.CPtr) -> int:
return vqt6_qstackedwidget_add_widget(self._ptr, w)
def removeWidget(self, w: t.CPtr):
vqt6_qstackedwidget_remove_widget(self._ptr, w)
def count(self) -> int:
return vqt6_qstackedwidget_count(self._ptr)
def currentIndex(self) -> int:
return vqt6_qstackedwidget_current_index(self._ptr)
def setCurrentIndex(self, index: int):
vqt6_qstackedwidget_set_current_index(self._ptr, index)
def currentWidget(self) -> t.CPtr:
return vqt6_qstackedwidget_current_widget(self._ptr)
def show(self):
_w_show(self._ptr)
def hide(self):
_w_hide(self._ptr)
def setGeometry(self, x: int, y: int, w: int, h: int):
_w_set_geometry(self._ptr, x, y, w, h)
def resize(self, w: int, h: int):
_w_resize(self._ptr, w, h)
def move(self, x: int, y: int):
_w_move(self._ptr, x, y)
def setEnabled(self, enabled: int):
_w_set_enabled(self._ptr, enabled)
# ============================================================
# 布局:QHBoxLayout / QVBoxLayout / QGridLayout
# ============================================================
@t.NoVTable
class QHBoxLayout:
"""QHBoxLayout 包装(addWidget 传控件 ._ptr)"""
_ptr: QtBoxLayoutPtr
def __init__(self, parent: "QWidget | None" = None):
if parent is not None and parent._ptr is not None:
self._ptr = vqt6_qhboxlayout_create_with_parent(parent._ptr)
else:
self._ptr = vqt6_qhboxlayout_create()
if self._ptr is None:
raise RuntimeError("Failed to create QHBoxLayout")
def addWidget(self, widget: t.CPtr):
vqt6_qlayout_add_widget(self._ptr, widget)
def removeWidget(self, widget: t.CPtr):
vqt6_qlayout_remove_widget(self._ptr, widget)
def addLayout(self, child: t.CPtr):
vqt6_qhboxlayout_add_layout(self._ptr, child)
def addStretch(self, stretch: int):
vqt6_qhboxlayout_add_stretch(self._ptr, stretch)
def addSpacing(self, size: int):
vqt6_qhboxlayout_add_spacing(self._ptr, size)
def setSpacing(self, spacing: int):
vqt6_qlayout_set_spacing(self._ptr, spacing)
def setContentsMargins(self, left: int, top: int, right: int, bottom: int):
vqt6_qlayout_set_contents_margins(self._ptr, left, top, right, bottom)
@t.NoVTable
class QVBoxLayout:
"""QVBoxLayout 包装(addWidget 传控件 ._ptr)"""
_ptr: QtBoxLayoutPtr
def __init__(self, parent: "QWidget | None" = None):
if parent is not None and parent._ptr is not None:
self._ptr = vqt6_qvboxlayout_create_with_parent(parent._ptr)
else:
self._ptr = vqt6_qvboxlayout_create()
if self._ptr is None:
raise RuntimeError("Failed to create QVBoxLayout")
def addWidget(self, widget: t.CPtr):
vqt6_qlayout_add_widget(self._ptr, widget)
def removeWidget(self, widget: t.CPtr):
vqt6_qlayout_remove_widget(self._ptr, widget)
def addLayout(self, child: t.CPtr):
vqt6_qvboxlayout_add_layout(self._ptr, child)
def addStretch(self, stretch: int):
vqt6_qvboxlayout_add_stretch(self._ptr, stretch)
def addSpacing(self, size: int):
vqt6_qvboxlayout_add_spacing(self._ptr, size)
def setSpacing(self, spacing: int):
vqt6_qlayout_set_spacing(self._ptr, spacing)
def setContentsMargins(self, left: int, top: int, right: int, bottom: int):
vqt6_qlayout_set_contents_margins(self._ptr, left, top, right, bottom)
@t.NoVTable
class QGridLayout:
"""QGridLayout 包装(addWidget 传控件 ._ptr)"""
_ptr: QtGridLayoutPtr
def __init__(self, parent: "QWidget | None" = None):
if parent is not None and parent._ptr is not None:
self._ptr = vqt6_qgridlayout_create_with_parent(parent._ptr)
else:
self._ptr = vqt6_qgridlayout_create()
if self._ptr is None:
raise RuntimeError("Failed to create QGridLayout")
def addWidget(self, widget: t.CPtr, row: int, col: int):
vqt6_qgridlayout_add_widget(self._ptr, widget, row, col)
def addWidgetWithSpan(self, widget: t.CPtr, row: int, col: int, row_span: int, col_span: int):
vqt6_qgridlayout_add_widget_with_span(self._ptr, widget, row, col, row_span, col_span)
def setSpacing(self, spacing: int):
vqt6_qlayout_set_spacing(self._ptr, spacing)
def setContentsMargins(self, left: int, top: int, right: int, bottom: int):
vqt6_qlayout_set_contents_margins(self._ptr, left, top, right, bottom)
# ============================================================
# 对话框:QMessageBox / QFileDialog(静态方法)
# ============================================================
@t.NoVTable
class QMessageBox:
"""QMessageBox 静态对话框"""
_ptr: QtMessageBoxPtr
@staticmethod
def information(parent: "QWidget | None", title: str, text: str, buttons: int = QT_OK) -> int:
qs_title: QtStringPtr = vqt6_qstring_create(title)
qs_text: QtStringPtr = vqt6_qstring_create(text)
parent_ptr: t.CPtr = None
if parent is not None and parent._ptr is not None:
parent_ptr = parent._ptr
r: int = vqt6_qmessagebox_information(parent_ptr, qs_title, qs_text, buttons)
vqt6_qstring_free(qs_title)
vqt6_qstring_free(qs_text)
return r
@staticmethod
def warning(parent: "QWidget | None", title: str, text: str, buttons: int = QT_OK) -> int:
qs_title: QtStringPtr = vqt6_qstring_create(title)
qs_text: QtStringPtr = vqt6_qstring_create(text)
parent_ptr: t.CPtr = None
if parent is not None and parent._ptr is not None:
parent_ptr = parent._ptr
r: int = vqt6_qmessagebox_warning(parent_ptr, qs_title, qs_text, buttons)
vqt6_qstring_free(qs_title)
vqt6_qstring_free(qs_text)
return r
@staticmethod
def critical(parent: "QWidget | None", title: str, text: str, buttons: int = QT_OK) -> int:
qs_title: QtStringPtr = vqt6_qstring_create(title)
qs_text: QtStringPtr = vqt6_qstring_create(text)
parent_ptr: t.CPtr = None
if parent is not None and parent._ptr is not None:
parent_ptr = parent._ptr
r: int = vqt6_qmessagebox_critical(parent_ptr, qs_title, qs_text, buttons)
vqt6_qstring_free(qs_title)
vqt6_qstring_free(qs_text)
return r
@staticmethod
def question(parent: "QWidget | None", title: str, text: str, buttons: int = QT_OK | QT_CANCEL) -> int:
qs_title: QtStringPtr = vqt6_qstring_create(title)
qs_text: QtStringPtr = vqt6_qstring_create(text)
parent_ptr: t.CPtr = None
if parent is not None and parent._ptr is not None:
parent_ptr = parent._ptr
r: int = vqt6_qmessagebox_question(parent_ptr, qs_title, qs_text, buttons)
vqt6_qstring_free(qs_title)
vqt6_qstring_free(qs_text)
return r
@staticmethod
def about(parent: "QWidget | None", title: str, text: str):
qs_title: QtStringPtr = vqt6_qstring_create(title)
qs_text: QtStringPtr = vqt6_qstring_create(text)
parent_ptr: t.CPtr = None
if parent is not None and parent._ptr is not None:
parent_ptr = parent._ptr
vqt6_qmessagebox_about(parent_ptr, qs_title, qs_text)
vqt6_qstring_free(qs_title)
vqt6_qstring_free(qs_text)
@t.NoVTable
class QFileDialog:
"""QFileDialog 静态对话框"""
_ptr: QtFileDialogPtr
@staticmethod
def getOpenFileName(parent: "QWidget | None", caption: str, directory: str, filter_str: str = "") -> str:
qs_caption: QtStringPtr = vqt6_qstring_create(caption)
qs_dir: QtStringPtr = vqt6_qstring_create(directory)
qs_filter: QtStringPtr = vqt6_qstring_create(filter_str)
parent_ptr: t.CPtr = None
if parent is not None and parent._ptr is not None:
parent_ptr = parent._ptr
result: QtStringPtr = vqt6_qfiledialog_get_open_file_name(parent_ptr, qs_caption, qs_dir, qs_filter)
vqt6_qstring_free(qs_caption)
vqt6_qstring_free(qs_dir)
vqt6_qstring_free(qs_filter)
return _w_text_of(result)
@staticmethod
def getSaveFileName(parent: "QWidget | None", caption: str, directory: str, filter_str: str = "") -> str:
qs_caption: QtStringPtr = vqt6_qstring_create(caption)
qs_dir: QtStringPtr = vqt6_qstring_create(directory)
qs_filter: QtStringPtr = vqt6_qstring_create(filter_str)
parent_ptr: t.CPtr = None
if parent is not None and parent._ptr is not None:
parent_ptr = parent._ptr
result: QtStringPtr = vqt6_qfiledialog_get_save_file_name(parent_ptr, qs_caption, qs_dir, qs_filter)
vqt6_qstring_free(qs_caption)
vqt6_qstring_free(qs_dir)
vqt6_qstring_free(qs_filter)
return _w_text_of(result)
@staticmethod
def getExistingDirectory(parent: "QWidget | None", caption: str, directory: str) -> str:
qs_caption: QtStringPtr = vqt6_qstring_create(caption)
qs_dir: QtStringPtr = vqt6_qstring_create(directory)
parent_ptr: t.CPtr = None
if parent is not None and parent._ptr is not None:
parent_ptr = parent._ptr
result: QtStringPtr = vqt6_qfiledialog_get_existing_directory(parent_ptr, qs_caption, qs_dir)
vqt6_qstring_free(qs_caption)
vqt6_qstring_free(qs_dir)
return _w_text_of(result)
# ============================================================
# 定时器:QTimer
# ============================================================
@t.NoVTable
class QTimer:
"""QTimer 包装"""
_ptr: QtTimerPtr
def __init__(self):
self._ptr = vqt6_qtimer_create()
if self._ptr is None:
raise RuntimeError("Failed to create QTimer")
def start(self, interval_ms: int):
vqt6_qtimer_start(self._ptr, interval_ms)
def stop(self):
vqt6_qtimer_stop(self._ptr)
def setInterval(self, interval_ms: int):
vqt6_qtimer_set_interval(self._ptr, interval_ms)
def interval(self) -> int:
return vqt6_qtimer_interval(self._ptr)
def setSingleShot(self, single_shot: int):
vqt6_qtimer_set_single_shot(self._ptr, single_shot)
def isActive(self) -> int:
return vqt6_qtimer_is_active(self._ptr)
def timeout(self, cb: bytes, data: bytes = 0):
vqt6_qtimer_connect_timeout(self._ptr, cb, data)
# ============================================================
# 菜单:QMenuBar / QMenu / QAction / QStatusBar
# ============================================================
@t.NoVTable
class QMenuBar:
"""QMenuBar 包装"""
_ptr: QtMenuBarPtr
def __init__(self, parent: "QWidget | None" = None):
if parent is not None and parent._ptr is not None:
self._ptr = vqt6_qmenubar_create_with_parent(parent._ptr)
else:
self._ptr = vqt6_qmenubar_create()
if self._ptr is None:
raise RuntimeError("Failed to create QMenuBar")
def addMenu(self, title: str) -> "QMenu":
qs: QtStringPtr = vqt6_qstring_create(title)
mp: QtMenuPtr = vqt6_qmenubar_add_menu(self._ptr, qs)
vqt6_qstring_free(qs)
m = QMenu()
m._ptr = mp
return m
def addAction(self, action: t.CPtr):
vqt6_qmenubar_add_action(self._ptr, action)
def clear(self):
vqt6_qmenubar_clear(self._ptr)
@t.NoVTable
class QMenu:
"""QMenu 包装"""
_ptr: QtMenuPtr
def __init__(self, title: str = ""):
if title != "":
qs: QtStringPtr = vqt6_qstring_create(title)
self._ptr = vqt6_qmenu_create_with_title(qs)
vqt6_qstring_free(qs)
else:
self._ptr = vqt6_qmenu_create()
if self._ptr is None:
raise RuntimeError("Failed to create QMenu")
def addAction(self, action: t.CPtr):
vqt6_qmenu_add_action(self._ptr, action)
def addActionWithText(self, text: str) -> "QAction":
qs: QtStringPtr = vqt6_qstring_create(text)
ap: QtActionPtr = vqt6_qmenu_add_action_with_text(self._ptr, qs)
vqt6_qstring_free(qs)
a = QAction()
a._ptr = ap
return a
def addMenu(self, title: str) -> "QMenu":
qs: QtStringPtr = vqt6_qstring_create(title)
mp: QtMenuPtr = vqt6_qmenu_add_menu(self._ptr, qs)
vqt6_qstring_free(qs)
m = QMenu()
m._ptr = mp
return m
def addSeparator(self):
vqt6_qmenu_add_separator(self._ptr)
def setTitle(self, title: str):
qs: QtStringPtr = vqt6_qstring_create(title)
vqt6_qmenu_set_title(self._ptr, qs)
vqt6_qstring_free(qs)
def clear(self):
vqt6_qmenu_clear(self._ptr)
@t.NoVTable
class QAction:
"""QAction 包装"""
_ptr: QtActionPtr
def __init__(self, text: str = ""):
if text != "":
qs: QtStringPtr = vqt6_qstring_create(text)
self._ptr = vqt6_qaction_create_with_text(qs)
vqt6_qstring_free(qs)
else:
self._ptr = vqt6_qaction_create()
if self._ptr is None:
raise RuntimeError("Failed to create QAction")
def setText(self, text: str):
qs: QtStringPtr = vqt6_qstring_create(text)
vqt6_qaction_set_text(self._ptr, qs)
vqt6_qstring_free(qs)
def text(self) -> str:
return _w_text_of(vqt6_qaction_text(self._ptr))
def setShortcut(self, key_seq: str):
qs: QtStringPtr = vqt6_qstring_create(key_seq)
vqt6_qaction_set_shortcut(self._ptr, qs)
vqt6_qstring_free(qs)
def setCheckable(self, checkable: int):
vqt6_qaction_set_checkable(self._ptr, checkable)
def isCheckable(self) -> int:
return vqt6_qaction_is_checkable(self._ptr)
def setChecked(self, checked: int):
vqt6_qaction_set_checked(self._ptr, checked)
def isChecked(self) -> int:
return vqt6_qaction_is_checked(self._ptr)
def setEnabled(self, enabled: int):
vqt6_qaction_set_enabled(self._ptr, enabled)
def isEnabled(self) -> int:
return vqt6_qaction_is_enabled(self._ptr)
def trigger(self):
vqt6_qaction_trigger(self._ptr)
def triggered(self, cb: bytes, data: bytes = 0):
vqt6_qaction_connect_triggered(self._ptr, cb, data)
@t.NoVTable
class QStatusBar:
"""QStatusBar 包装"""
_ptr: QtStatusBarPtr
def __init__(self, parent: "QWidget | None" = None):
if parent is not None and parent._ptr is not None:
self._ptr = vqt6_qstatusbar_create_with_parent(parent._ptr)
else:
self._ptr = vqt6_qstatusbar_create()
if self._ptr is None:
raise RuntimeError("Failed to create QStatusBar")
def showMessage(self, message: str, timeout_ms: int = 0):
qs: QtStringPtr = vqt6_qstring_create(message)
vqt6_qstatusbar_show_message(self._ptr, qs, timeout_ms)
vqt6_qstring_free(qs)
def clearMessage(self):
vqt6_qstatusbar_clear_message(self._ptr)
def currentMessage(self) -> str:
return _w_text_of(vqt6_qstatusbar_current_message(self._ptr))
def addWidget(self, w: t.CPtr, stretch: int = 0):
vqt6_qstatusbar_add_widget(self._ptr, w, stretch)
# ============================================================
# 绘图基础:QColor / QFont
# ============================================================
@t.NoVTable
class QColor:
"""QColor 包装"""
_ptr: QtColorPtr
def __init__(self, r: int, g: int, b: int, a: int = 255):
self._ptr = vqt6_qcolor_create_rgba(r, g, b, a)
if self._ptr is None:
raise RuntimeError("Failed to create QColor")
def red(self) -> int:
return vqt6_qcolor_red(self._ptr)
def green(self) -> int:
return vqt6_qcolor_green(self._ptr)
def blue(self) -> int:
return vqt6_qcolor_blue(self._ptr)
def alpha(self) -> int:
return vqt6_qcolor_alpha(self._ptr)
@t.NoVTable
class QFont:
"""QFont 包装"""
_ptr: QtFontPtr
def __init__(self, family: str = "", point_size: int = 0):
if family != "":
qs: QtStringPtr = vqt6_qstring_create(family)
if point_size > 0:
self._ptr = vqt6_qfont_create_with_family_size(qs, point_size)
else:
self._ptr = vqt6_qfont_create_with_family(qs)
vqt6_qstring_free(qs)
else:
self._ptr = vqt6_qfont_create()
if self._ptr is None:
raise RuntimeError("Failed to create QFont")
def setPointSize(self, size: int):
vqt6_qfont_set_point_size(self._ptr, size)
def setPixelSize(self, size: int):
vqt6_qfont_set_pixel_size(self._ptr, size)
def setBold(self, bold: int):
vqt6_qfont_set_bold(self._ptr, bold)
def setItalic(self, italic: int):
vqt6_qfont_set_italic(self._ptr, italic)
def setUnderline(self, underline: int):
vqt6_qfont_set_underline(self._ptr, underline)
# ============================================================
# 模块导出
# ============================================================
__all__ = [
# 高层类
"QApplication", "QWidget", "QLabel", "QPushButton",
"QMainWindow", "QDialog",
"QLineEdit", "QCheckBox", "QRadioButton",
"QComboBox", "QSlider", "QSpinBox", "QProgressBar",
"QTextEdit", "QPlainTextEdit", "QListWidget",
"QTreeWidget", "QTreeWidgetItem",
"QTabWidget", "QStackedWidget",
"QHBoxLayout", "QVBoxLayout", "QGridLayout",
"QMessageBox", "QFileDialog", "QTimer",
"QMenuBar", "QMenu", "QAction", "QStatusBar",
"QColor", "QFont",
# 类型
"QtObjectPtr", "QtStringPtr", "QtByteArrayPtr", "QtWidgetPtr", "QtAppPtr",
"QtLabelPtr", "QtPushButtonPtr",
"QtTreeWidgetPtr", "QtTreeWidgetItemPtr",
"QtColorPtr", "QtFontPtr", "QtPixmapPtr", "QtImagePtr", "QtPainterPtr",
"QtTcpSocketPtr", "QtHostAddressPtr", "QtNetworkRequestPtr", "QtNetworkReplyPtr",
# 常量
"QT_KEY_ESCAPE", "QT_KEY_RETURN", "QT_KEY_A", "QT_KEY_Z",
"QT_LEFT_BUTTON", "QT_RIGHT_BUTTON", "QT_MID_BUTTON",
"QT_HORIZONTAL", "QT_VERTICAL",
"QT_ALIGN_LEFT", "QT_ALIGN_CENTER", "QT_ALIGN_RIGHT",
"QT_PORT_HTTP", "QT_PORT_HTTPS", "QT_PORT_FTP",
"QT_OK", "QT_CANCEL", "QT_YES", "QT_NO", "QT_CLOSE",
]