• 6647阅读
  • 5回复

关于按钮的信号和槽的问题 [复制链接]

上一主题 下一主题
离线溟阡
 
只看楼主 倒序阅读 楼主  发表于: 2009-02-13
— 本帖被 XChinux 执行加亮操作(2009-02-16) —
我想通过读取文件,然后按照文件中的信息在主窗口中生成一排按钮

//其中num是文件中读出的有效行数,并且在头文件中定义了按钮数组
for (int i = 0; i < num; i++) {
        button = new QPushButton(icon, "");
        connect(button, SIGNAL(clicked()),this, SLOT(open()));
}

现在这一排按钮已经生成了,可是我无法判断哪个按钮执行什么样的操作
哪个按钮能够执行什么样的操作在文件中确定
比如说,我想点击第一个按钮时打开A窗口,点击第二个按钮时打开B窗口
那么我的open()应该怎么写呢?或者是采用别的什么方法能够实现?

这样做的目的主要是在想要修改界面的时候不用改代码了……麻烦各位高手多多指点
离线wd007

只看该作者 1楼 发表于: 2009-02-13
这个不难吧,你的文件用xml表示,在其中定义好标签就是了,把按钮响应的信号,要执行的动作
都写进去,然后在做一个维护工具,就完美了
欢迎访问我的博客,一起学习提高
http://blog.csdn.net/qter_wd007
离线weizhy
只看该作者 2楼 发表于: 2009-02-13
如果你的各种可选操作已经确定,那么可以使用 QButtonGroup,他的clicked信号可以给出你真实按下的按钮的指针,然后你可以根据不同指针做不通操作

如果你的操作十分相似,比如都是打开某窗口,只不过打开的窗口类型不一样,那么我建议你使用QSignalMapper,他可以将你的各个按钮的clicked信号加上一个标识再发出去,这样你只需要一个slot就可以接收了,然后在slot里根据标识的不同确定打开不同的窗口
离线溟阡
只看该作者 3楼 发表于: 2009-02-16
楼上能把QSignalMapper详细说下么?我查了下文档,看的不是很明白。
我的按钮操作不确定是什么,打开的窗口类型有相同的怎么办呢?主要是想实现在点击按钮的时候能够类似于java中的反射,我不需要知道应该new哪个类,程序会找到那个类然后自动new出来
离线weizhy
只看该作者 4楼 发表于: 2009-02-16
你可以将按钮标识和要new的类对象指针建立映射,或者使用构造工厂

关于QSignalMapper,假定你已经建立了一个对象,其指针为signalMapper

假定button是创建一个QPushButton对象后的指针,在创建完每个QPushButton对象后建立如下链接:
connect(button, SIGNAL(clicked()), signalMapper, SLOT(map()));
signalMapper->setMapping(button, xxx);    //其中的xxx是为每个button设定不通的标识,例如可以设定为button的text之类
                                                                            //可以是int类型,也可以是QString类型

而在signalMapper创建后使用如下链接,其中this->clicked(const QString&)是你的处理槽
connect(signalMapper, SIGNAL(mapped(const QString &)), this, SIGNAL(clicked(const QString &)));

这样一来,任何按钮被按下时,会触发QPushButton::clicked()信号,而后触发QSignalMapper::map()信号,而后由QSignalMapper抛出mapped()信号,触发我们自定义的clicked信号,并且在后一个过程中,是带参数标识的,我们现在就可以利用这个参数标识知道获取的是哪个按钮了

如果这时你又一个标识和类对象指针或者标识和构造工厂的映射,你就知道使用哪个对象或者使用哪个工厂创建你的对象了

呼呼,其实assistant中的介绍不难懂的,你得自己去试
离线溟阡
只看该作者 5楼 发表于: 2009-02-16
谢谢楼上的~现在清楚多了~
快速回复
限100 字节
 
上一个 下一个