找回密码
 立即注册
收起左侧

Qt Label控制

9
回复
5012
查看
[复制链接]
累计签到:49 天
连续签到:1 天
来源: 2019-5-21 15:36:00 显示全部楼层 |阅读模式
1Qter豆
如果widget上面有5个Label,这个5个Label的objectName是分别为Label1、Label2、Label3、Label4、Label5,我封装了一个函数,函数作用时清空某一个Label的内容,fun(QString str),str可能为“Label1”、“Label2”、“Label3”、“Label4”、“Label5”,内容是那个Label,就清空那个Label。比如调用fun("Label3"),那就要把Label3的内容清空。调用fun("Label4"),那就要把Label4的内容清空。怎么写这个函数?

回复

使用道具 举报

累计签到:882 天
连续签到:3 天
2019-5-22 09:24:34 显示全部楼层
函数里做入参和对象名的比较,然后再对应分支处理就可以了
回复

使用道具 举报

累计签到:118 天
连续签到:2 天
2019-5-22 15:40:38 显示全部楼层

void MainWindow::fun(QString str)
{
    switch (str) {
    case "laber":
        ui->label->clear();               
        break;
    case "laber2":
        ui->label_2->clear();
        break;
    default:        
        break;
    }
}
回复

使用道具 举报

累计签到:49 天
连续签到:1 天
2019-5-22 20:35:18 显示全部楼层
一叶知秋 发表于 2019-5-22 09:24
函数里做入参和对象名的比较,然后再对应分支处理就可以了

关键是怎么找到控件?
我不希望通过下面这种方式,这种方式效率太低了,需要遍历所有的控件
void fun(QStirng str)
{
QObjectList list = children();
    foreach (QObject *obj, list)
    {
        if (obj->inherits("QLabel"))
        {
            QLabel*pLabel = qobject_cast<QLabel*>(obj);
            if(pLabel->objName()==str)
                ........做一些事情
        }
    }
}
回复

使用道具 举报

累计签到:49 天
连续签到:1 天
2019-5-22 20:36:33 显示全部楼层
zhuxianfei 发表于 2019-5-22 15:40
void MainWindow::fun(QString str)
{
    switch (str) {

如果有100个QLabel,用这种方式,就比较慢了,有没有更好的。
回复

使用道具 举报

累计签到:118 天
连续签到:2 天
2019-5-23 09:48:41 显示全部楼层
xiaodong60606 发表于 2019-5-22 20:36
如果有100个QLabel,用这种方式,就比较慢了,有没有更好的。

嗯,100个有100个的写法,如果要提高遍历效率,这个就看算法了

点评

其实我是想知道qt有没有接口直接通过控件的名称,取出控件的指针?  详情 回复 发表于 2019-5-23 10:17
回复

使用道具 举报

累计签到:49 天
连续签到:1 天
2019-5-23 10:17:50 显示全部楼层
zhuxianfei 发表于 2019-5-23 09:48
嗯,100个有100个的写法,如果要提高遍历效率,这个就看算法了

其实我是想知道qt有没有接口直接通过控件的名称,取出控件的指针?
回复

使用道具 举报

累计签到:118 天
连续签到:2 天
2019-5-23 10:34:20 显示全部楼层
本帖最后由 zhuxianfei 于 2019-5-23 10:35 编辑

如果你的控件是在UI设计师里面直接拖进去的,你可以使用ui->label-> 这样调用这个指针。你也可以在类的私有变量里面定义QLaber * label[100],然后在构造函数里面实例化这些Label,这时候你可以对这些Label命名你想要的名字,再手动把这些Label添加到你的ui里面,这样在这个类里面,你全局都可以使用这些Label的指针。
回复

使用道具 举报

累计签到:882 天
连续签到:3 天
2019-5-23 10:52:53 显示全部楼层
提供一种思路,使用循环生成label,label的对象名命名为,循环变量值,然后将label指针存到链表里,或者数组里,这样就建立了映射关系,然后以对象名转int作为下表访问,应该可以满足你的需求
回复

使用道具 举报

累计签到:882 天
连续签到:3 天
2019-5-23 10:56:44 显示全部楼层
最笨的方法就是用switch,不过你这对象这么多,应该会写吐吧,哈哈。。。。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了