本篇实现两个窗口的切换
窗口一点击按钮后切换到窗口二,并全程由Lua控制
实现效果如图:
#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <Kaguya/kaguya.hpp>
#include <memory>
class LuaPushButton : public QPushButton
{
public:
LuaPushButton(QWidget* parent = nullptr) : QPushButton(parent) {}
void setClickCallback(kaguya::LuaFunction callback)
{
m_callback_m_clicked = callback;
QObject::connect(this, &LuaPushButton::clicked, [&]() {
m_callback_m_clicked();
});
}
private:
kaguya::LuaFunction m_callback_m_clicked;
};
class LuaWidget : public QWidget
{
public:
LuaWidget(QWidget* parent = nullptr) : QWidget(parent) {}
~LuaWidget()
{
for (size_t i = 0; i < buttons.size(); i++)
{
buttons[i]->hide();
buttons[i]->setParent(nullptr);
}
}
void setTitle(const std::string& title)
{
setWindowTitle(QString::fromStdString(title));
}
void setSize(int width, int height)
{
resize(width, height);
}
void addButton(const std::string& text, kaguya::LuaFunction callback)
{
LuaPushButton* button =new LuaPushButton(this);
button->setText(QString::fromStdString(text));
button->setClickCallback(callback);
// 将按钮添加到内部的按钮列表中
buttons.push_back(button);
}
void showWidget()
{
show();
}
void hideWidget()
{
hide();
}
private:
std::vector<QPushButton*> buttons;
};
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
// 创建 Lua 状态机
kaguya::State lua;
// 将 QWidget 封装类注册到 Lua 中
lua["LuaWidget"].setClass(kaguya::UserdataMetatable<LuaWidget>()
.setConstructors<LuaWidget()>()
.addFunction("setTitle", &LuaWidget::setTitle)
.addFunction("setSize", &LuaWidget::setSize)
.addFunction("addButton", &LuaWidget::addButton)
.addFunction("show", &LuaWidget::showWidget)
.addFunction("hide", &LuaWidget::hideWidget)
);
// 将 LuaPushButton 封装类注册到 Lua 中
lua["LuaPushButton"].setClass(kaguya::UserdataMetatable<LuaPushButton>()
.setConstructors<LuaPushButton()>()
.addFunction("setClickCallback", &LuaPushButton::setClickCallback)
);
// 在 Lua 中执行 Lua 代码字符串
lua(R"(
-- 创建第一个窗口
local window1 = LuaWidget.new()
window1:setTitle('Window 1')
window1:setSize(400, 400)
-- 创建第二个窗口
local window2 = LuaWidget.new()
window2:setTitle('Window 2')
window2:setSize(400, 400)
-- 创建按钮并添加到第一个窗口
window1:addButton('Show Window 2', function()
window2:show()
window1:hide()
end)
-- 创建按钮并添加到第二个窗口
window2:addButton('Show Window 1', function()
window1:show()
window2:hide()
end)
-- 显示第一个窗口
window1:show()
)");
return app.exec();
}