• 6329阅读
  • 9回复

[提问]怎样把槽函数名称作为函数的参数传递给connect ? [复制链接]

上一主题 下一主题
离线alexltr
 

只看楼主 倒序阅读 楼主  发表于: 2012-12-27
如下图所示,怎样把槽函数名称作为函数的参数传递给connect ?  谢谢.



  1. void ClassName::SlotA()
  2. {    
  3.    ………    
  4. }
  5. void ClassName::SlotB()
  6. {    
  7.     ………    
  8. }
  9. void ClassName::SlotC()
  10. {    
  11.     ………    
  12. }
  13. void ClassName::createMenuAction(const QString &title, const char *slotChar, QMenu *menu)
  14. {    
  15.     QAction *action = new QAction(title,this);    
  16.     menu->addAction(action);    
  17.     connect(action, SIGNAL(triggered()), this, ??????);
  18. }
  19. void ClassName::createMenu()
  20. {    
  21.      ……    
  22.      createMenuAction("Open", "OpenFile", fileMenu);    
  23.      ……
  24. }



我不从事IT,只是喜欢Qt。
我不是程序员,只是与程序有缘。
我写程序,只是为了让工作变得简单有序!

                      ----  一个一直在入门的编程学习者
离线justwake

只看该作者 1楼 发表于: 2012-12-27
参数用    指向函数的指针  试试!
离线kimtaikee

只看该作者 2楼 发表于: 2012-12-27
终于见到一个比较新颖的问题了。
  1. void ClassName::SlotA()
  2. {    
  3.    ………    
  4. }
  5. void ClassName::SlotB()
  6. {    
  7.     ………    
  8. }
  9. void ClassName::SlotC()
  10. {    
  11.     ………    
  12. }
  13. void ClassName::createMenuAction(const QString &title, const char *slotChar, QMenu *menu)
  14. {    
  15.     QAction *action = new QAction(title,this);    
  16.     menu->addAction(action);    
  17.     connect(action, SIGNAL(triggered()), this, ??????);
  18. }
  19. void ClassName::createMenu()
  20. {    
  21.      ……    
  22.      createMenuAction("Open",SLOT(SlotA()), fileMenu);    
  23.      ……
  24. }



离线roywillow

只看该作者 3楼 发表于: 2012-12-27
好吧够新颖……
去看Qt的信号槽机制去
因为现在出Qt5了,connect语法有变,请自行以文档为准
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线alexltr

只看该作者 4楼 发表于: 2012-12-27
回 2楼(kimtaikee) 的帖子
乍一看还没反应过来,细看后才明白过来。
之前一直考虑怎么把槽函数名转成前面有字符'1’'的char, 如: 1SlotA(), 但一直无法解决。
现在对SIGNAL和SLOT和又有了一点新的认识。

谢谢你,kimtaikee. 谢谢你对我一直以来的帮助。
我不从事IT,只是喜欢Qt。
我不是程序员,只是与程序有缘。
我写程序,只是为了让工作变得简单有序!

                      ----  一个一直在入门的编程学习者
离线XChinux

只看该作者 5楼 发表于: 2012-12-27
boost里有很多好类似的好东西,可以多看看。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线roywillow

只看该作者 6楼 发表于: 2012-12-27
那么Qt5的新语法是怎么处理的?还能实现这种效果吗
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线0354030w

只看该作者 7楼 发表于: 2012-12-28
   QToolButton *createToolButton(const QString &toolTip, const                                                     QIcon &icon,  const char *member)
   {connect(button, SIGNAL(clicked()), this, member);  
   }
   newCircleButton=createToolButton(tr("NewCircle"),QIcon(":/images/circle.png"),SLOT(createNewCircle()));    

Qt自带的例子里面有!
离线呆呆很呆
只看该作者 8楼 发表于: 2012-12-29
回 6楼(roywillow) 的帖子
当然能 去qobject.cpp 查看新语法实现(千万不要找与文档相符的 那个被#ifdef qdoc包住了 而且只有声明 没有定义) 可以看到&object::function 只是一个模板函数Func1 我们也这样 把函数改成模板函数 直接穿进去
离线daily

只看该作者 9楼 发表于: 2013-01-11
我倒是有一个方案,不要使用connect 试图来创建你的槽函数。 QT有一个全局的QMetaObject::invokeMethod(this,actionMember,Qt::DirectConnection);
具体实现:void CGmRbmMenuBaseConfiger::slotActionResponse()
{
    //warning : do not change any char....all RBM action call this function....
    QAction *pClickedAction = dynamic_cast<QAction*>(sender());
    QString strActionMember = pClickedAction->data().toString();
    QByteArray arr (strActionMember.toLatin1());
    const char* actionMember = arr.constData();
    //invoke method member must slot function.
    QObject *pInvokeObj=  reinterpret_cast<QObject *>(m_pRbmMenu->property("InvokeObj").value<QObject *>());
    bool b = QMetaObject::invokeMethod(m_pRbmResponser,actionMember,Qt::DirectConnection);
    if(!b)//invoke method from "m_pActionResponser".
    {
        b = QMetaObject::invokeMethod(m_pActionResponser,actionMember,Qt::DirectConnection);
    }
    if(!b)
    {
        b =QMetaObject::invokeMethod(this,actionMember,Qt::DirectConnection);
    }
    if(!b && pInvokeObj != NULL)
    {
        b =QMetaObject::invokeMethod(pInvokeObj,actionMember,Qt::DirectConnection);
    }
#ifndef NDEBUG
    if(!b)
    {
        QMessageBox::information(NULL,"Invoked Method failed. ","slot function "+strActionMember+" connect failed ,check you function name.");
    }
#endif
}
快速回复
限100 字节
 
上一个 下一个