现在在我的项目中需要用到这样一个功能:从数据文件中读取出数量不等的字符串,然后根据字符串的个数动态添加相应的按钮到主界面中,并且要求根据不同按钮的单击事件执行不同的代码。

//不会使用CSDN的code管理项目,只好上传代码片了

要下载完整源文件,请访问Code项目地址

首先新建一个空白项目,项目名称输入DynamicButtons,其它全部默认即可;

项目新建完成后找到 DynamicButtons.pro 文件双击打开,在其中增加一行内容,如下:

LIBS += -lbbsystem

然后根据代码片中的文件名,分别替换项目中对应文件的内容即可。

#include "applicationui.hpp"
#include #include #include #include #include #include using namespace bb::cascades; using namespace bb::system; void ApplicationUI::handleClicked() { Button *button=qobject_cast (sender());
for(int i=0; isize(); i++)
{
QString objName=m_List[i];
if(button->objectName()==objName)
{
SystemToast tips;
tips.setBody("\"" + objName + "\" clicked");
tips.setAutoUpdateEnabled(true);
tips.exec();
qDebug() << objName << "clicked";
break;
}
}
}
void ApplicationUI::init(QObject* container)
{
m_Container=dynamic_cast(container);
}
ApplicationUI::ApplicationUI(bb::cascades::Application *app) : QObject(app)
{
m_pTranslator = new QTranslator(this);
m_pLocaleHandler = new LocaleHandler(this);
bool res = QObject::connect(m_pLocaleHandler, SIGNAL(systemLanguageChanged()), this, SLOT(onSystemLanguageChanged()));
Q_ASSERT(res);
Q_UNUSED(res);
onSystemLanguageChanged();
QmlDocument *qml = QmlDocument::create("asset:///main.qml").parent(this);
qml->setContextProperty("_app", this); //要在qml中调用类方法这一步是关键,必须要在createRootObject之前调用
AbstractPane *root = qml->createRootObject();
app->setScene(root);
for(int i=0; i<10; i++)
{
m_List[i]="This is Button " + QString::number(i, 10);
m_Buttons[i].create();
m_Buttons[i].setText(m_List[i]);
m_Buttons[i].setHorizontalAlignment(HorizontalAlignment::Center);
m_Buttons[i].setObjectName(m_List[i]);
bool connectResult;
Q_UNUSED(connectResult);
connectResult=QObject::connect(&m_Buttons[i], SIGNAL(clicked()), this, SLOT(handleClicked()));
Q_ASSERT(connectResult);
m_Container->add(&m_Buttons[i]);
}
}
void ApplicationUI::onSystemLanguageChanged()
{
QCoreApplication::instance()->removeTranslator(m_pTranslator);
QString locale_string = QLocale().name();
QString file_name = QString("DynamicButtons_%1").arg(locale_string);
if (m_pTranslator->load(file_name, "app/native/qm")) {
QCoreApplication::instance()->installTranslator(m_pTranslator);
}
}
#include #include #include #include "applicationui.hpp" #include #include #include #include using namespace bb::cascades; void myMessageOutput(QtMsgType type, const char *msg) { switch (type) { case QtDebugMsg: fprintf(stderr, "Debug: %s\n", msg); break; case QtWarningMsg: fprintf(stderr, "Warning: %s\n", msg); break; case QtCriticalMsg: fprintf(stderr, "Critical: %s\n", msg); break; case QtFatalMsg: fprintf(stderr, "Fatal: %s\n", msg); abort(); } } Q_DECL_EXPORT int main(int argc, char **argv) { qInstallMsgHandler(myMessageOutput); qmlRegisterType("bb.system", 1, 0, "SystemToast"); Application app(argc, argv); new ApplicationUI(&app); return Application::exec(); } #ifndef ApplicationUI_HPP_ #define ApplicationUI_HPP_ #include #include #include namespace bb { namespace cascades { class Application; class LocaleHandler; class Container; } } class QTranslator; class ApplicationUI : public QObject { Q_OBJECT public: ApplicationUI(bb::cascades::Application *app); virtual ~ApplicationUI() { } Q_INVOKABLE void init(QObject *container); public slots: void handleClicked(); //自定义的事件槽,用于接收处理按钮单击事件 private slots: void onSystemLanguageChanged(); private: QTranslator* m_pTranslator; bb::cascades::LocaleHandler* m_pLocaleHandler; bb::cascades::Container* m_Container; bb::cascades::Button m_Buttons[10]; QString m_List[10]; }; #endif import bb.cascades 1.2 Page { onCreationCompleted: { _app.init(container); //窗口创建完成后调用类,以实现C++与QML相互调用 } Container { id: container topPadding: 20.0 } } 

文章参考:

  • BB10: Handling Several Buttons Click Event in CPP
  • QObject * QObject::sender () const

BB10动态创建Button并响应单击事件(C++版本)相关推荐

  1. MFC中动态创建button及添加响应事件

    MFC中动态创建button及添加响应的事件,主要步骤如下:  1.在头文件(**Dlg.h)中添加一个CButton类型,  例如:CButton btn;  2.在(**Dlg.cpp)的OnIn ...

  2. js给动态创建出来的元素添加事件

    场景:因为js都是dom操作,所以如果动态创建一个元素的话,本身是不带自身事件的,因为在创建这个元素前,dom已经创建完成了,所以在动态创建出来的元素身上不包含事件 所以我们需要给这些动态创建出来的元 ...

  3. MFC中动态创建控件以及添加事件响应

    本文实例讲述了MFC中动态创建控件以及事件响应实现方法,分享给大家供大家参考.具体实现方法如下: 动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的. 一.创建动态 ...

  4. VB.net 动态添加菜单响应单击事件

    以前 VB 6.0 我要调一堆 API 感觉好过瘾 呵呵 现在找不到这种感觉了 哈!记得vb 6 的 时候生气用Win32写了个Clock  掉了上百个 API 连VB 6 的窗体都没用, 那个叫过瘾 ...

  5. MFC 鼠标双击响应单击事件

    最近做练习双击鼠标左键时老是相应单击事件,网上查询和自我探索后解决问题,代码如下: 我写的代码为单击鼠标左键确定圆心,鼠标移动时产生橡皮筋线,双击鼠标结束,单双击鼠标之间的距离为圆的半径 void C ...

  6. js 动态生成button 并设置click事件

    <div id="MyDiv"></div> <script> function AddButton() {var MyDiv =documen ...

  7. C#,桌面编程入门(01)——按钮Button属性与事件、动态创建、快捷键、控件数组及自定义Button

    本文是<桌面编程入门>系列文章的开山之篇. <桌面编程入门>系列文章主要介绍桌面编程的各种组件,Button,ComboBox,Panel,WebBrowser...... 类 ...

  8. MFC动态创建控件并响应事件代码实现过程

    MFC动态创建控件以及响应动态创建的控件的事件的实现方法如下. 1.创建对象     用new进行动态创建一个对象.然后调用Create函数创建窗口,在函数的父窗口参数中传入this或者用AfxGet ...

  9. 禁用a标签的单击事件响应

    a标签默认有各种状态,例如:光标悬浮在a标签上时(hover).光标按下时(active).光标按下后即访问过(visited).默认状态(link),a标签默认能响应鼠标单击,当光标单击是默认打开h ...

最新文章

  1. DataGridView 密码列(显示为*号)的设置
  2. SQL Server学习1(建数据库,建表,建约束)
  3. Oracle 9i默认表空间
  4. opencv提取Mat中的某些行和列
  5. 【机器学习入门笔记15:BP神经网络逼近股票收盘价格2】20190218
  6. codevs 2865 天平系统1
  7. ffplay.c学习-1-框架及数据结构
  8. halcon read_ocr_trainf 从文件中读取训练字符并转换为图像
  9. exe打包工具哪个最好_一键分发工具哪个最好用?这款30万人都在用,很优秀!...
  10. java智能提示_【Java】智能提示的设置
  11. @程序员,React 使用如何避坑?
  12. ansible的介绍和一些基本模块介绍
  13. win10PPT不支持Flash动画
  14. 迅盘从入门到精通 彻底告别WIN7关机烦恼 T400亲测
  15. 使用matlab进行简单图像处理
  16. 计算机毕业设计(附源码)python-志愿者管理系统
  17. matlab绘制叮当猫
  18. 网络:CGI程序制作
  19. 从一个例子来看Tagged Pointer特性
  20. The Rust Programming Language - 第14章 更多关于Cargo和Crates.io的内容 - 14.2 将crate发布到Crate.io

热门文章

  1. JSP Java 期末复习整理
  2. linux下安装搜狗输入法(网上找的资料)
  3. PF-EPF-UPF的对比仿真
  4. 蓝叠、逍遥、夜游模拟器,虚拟机与hyper-v兼容问题解决,w10家庭版关闭hyper-v,华为matebook开启vt
  5. ios内购二次验证安全性问题_苹果IOS内购二次验证返回state为21002的坑
  6. 数电课设——555定时器设计数字时钟
  7. 安卓应用测试-ADB
  8. 9-2 什么是零点漂移 产生零点漂移的主要原因是什么 差动放大电路为什么能抑制零点漂移
  9. Lynda Audition CC 2018 Essential Training 中文字幕
  10. 牛啊!全球当下最厉害的 14 位程序员