Qt学习——聊天的QQ列表QToolBox类

QToolBox展示出来的抽屉效果可以设计联系人列表


下面展示类似聊天软件QQ的主界面



头文件主要就是定义这些联系人QToolButton:

  1. #include <QToolBox>   
  2. #include <QToolButton>   
  3. class Drawer : public QToolBox  
  4. {  
  5.     Q_OBJECT  
  6. public:  
  7.     Drawer(QWidget *parent=0,Qt::WindowFlags f=0);  
  8. private:  
  9.     QToolButton *toolBtn1_1;  
  10.     QToolButton *toolBtn1_2;  
  11.     QToolButton *toolBtn1_3;  
  12.     QToolButton *toolBtn1_4;  
  13.     QToolButton *toolBtn1_5;  
  14.     QToolButton *toolBtn2_1;  
  15.     QToolButton *toolBtn2_2;  
  16.     QToolButton *toolBtn3_1;  
  17.     QToolButton *toolBtn3_2;  
  18. };  

源文件将联系人加入到三个QToolBox中

  1. #include "drawer.h"   
  2. #include <QGroupBox>   
  3. #include <QVBoxLayout>   
  4. Drawer::Drawer(QWidget *parent,Qt::WindowFlags f)  
  5.     :QToolBox(parent,0)  
  6. {  
  7.     setWindowTitle(tr("My QQ"));  
  8. //***************初始化我的好友*****************   
  9.     toolBtn1_1=new QToolButton;  
  10.     toolBtn1_1->setText(tr("张三"));  
  11.     toolBtn1_1->setIcon(QPixmap("res/11.bmp"));  
  12.     toolBtn1_1->setIconSize(QPixmap("res/11.bmp").size());  
  13.     toolBtn1_1->setAutoRaise(TRUE);  
  14.     toolBtn1_1->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);  
  15.   
  16.     toolBtn1_2=new QToolButton;  
  17.     toolBtn1_2->setText(tr("李四"));  
  18.     toolBtn1_2->setIcon(QPixmap("res/12.bmp"));  
  19.     toolBtn1_2->setIconSize(QPixmap("res/12.bmp").size());  
  20.     toolBtn1_2->setAutoRaise(TRUE);  
  21.     toolBtn1_2->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);  
  22.   
  23.     toolBtn1_3=new QToolButton;  
  24.     toolBtn1_3->setText(tr("王五"));  
  25.     toolBtn1_3->setIcon(QPixmap("res/13.bmp"));  
  26.     toolBtn1_3->setIconSize(QPixmap("res/13.bmp").size());  
  27.     toolBtn1_3->setAutoRaise(TRUE);  
  28.     toolBtn1_3->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);  
  29.   
  30.     toolBtn1_4=new QToolButton;  
  31.     toolBtn1_4->setText(tr("小赵"));  
  32.     toolBtn1_4->setIcon(QPixmap("res/14.bmp"));  
  33.     toolBtn1_4->setIconSize(QPixmap("res/14.bmp").size());  
  34.     toolBtn1_4->setAutoRaise(TRUE);  
  35.     toolBtn1_4->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);  
  36.   
  37.     toolBtn1_5=new QToolButton;  
  38.     toolBtn1_5->setText(tr("小孙"));  
  39.     toolBtn1_5->setIcon(QPixmap("res/15.bmp"));  
  40.     toolBtn1_5->setIconSize(QPixmap("res/15.bmp").size());  
  41.     toolBtn1_5->setAutoRaise(TRUE);  
  42.     toolBtn1_5->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);  
  43. //***************添加我的好友*****************   
  44.     QGroupBox *groupBox1=new QGroupBox;  
  45.     QVBoxLayout *layout1=new QVBoxLayout(groupBox1);  
  46.     layout1->setMargin(10);  
  47.     layout1->setAlignment(Qt::AlignHCenter);  
  48.     layout1->addWidget(toolBtn1_1);  
  49.     layout1->addWidget(toolBtn1_2);  
  50.     layout1->addWidget(toolBtn1_3);  
  51.     layout1->addWidget(toolBtn1_4);  
  52.     layout1->addWidget(toolBtn1_5);  
  53.     layout1->addStretch();  
  54. //***************陌生人*********************   
  55.     toolBtn2_1=new QToolButton;  
  56.     toolBtn2_1->setText(tr("小王"));  
  57.     toolBtn2_1->setIcon(QPixmap("res/21.bmp"));  
  58.     toolBtn2_1->setIconSize(QPixmap("res/21.bmp").size());  
  59.     toolBtn2_1->setAutoRaise(TRUE);  
  60.     toolBtn2_1->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);  
  61.   
  62.     toolBtn2_2=new QToolButton;  
  63.     toolBtn2_2->setText(tr("小张"));  
  64.     toolBtn2_2->setIcon(QPixmap("res/22.bmp"));  
  65.     toolBtn2_2->setIconSize(QPixmap("res/22.bmp").size());  
  66.     toolBtn2_2->setAutoRaise(TRUE);  
  67.     toolBtn2_2->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);  
  68. //***************添加陌生人*****************   
  69.     QGroupBox *groupBox2=new QGroupBox;  
  70.     QVBoxLayout *layout2=new QVBoxLayout(groupBox2);  
  71.     layout2->setMargin(10);  
  72.     layout2->setAlignment(Qt::AlignHCenter);  
  73.     layout2->addWidget(toolBtn2_1);  
  74.     layout2->addWidget(toolBtn2_2);  
  75.     layout2->addStretch();  
  76. //***************黑名单*********************   
  77.     toolBtn3_1=new QToolButton;  
  78.     toolBtn3_1->setText(tr("小王"));  
  79.     toolBtn3_1->setIcon(QPixmap("res/31.bmp"));  
  80.     toolBtn3_1->setIconSize(QPixmap("res/31.bmp").size());  
  81.     toolBtn3_1->setAutoRaise(TRUE);  
  82.     toolBtn3_1->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);  
  83.   
  84.     toolBtn3_2=new QToolButton;  
  85.     toolBtn3_2->setText(tr("小张"));  
  86.     toolBtn3_2->setIcon(QPixmap("res/32.bmp"));  
  87.     toolBtn3_2->setIconSize(QPixmap("res/32.bmp").size());  
  88.     toolBtn3_2->setAutoRaise(TRUE);  
  89.     toolBtn3_2->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);  
  90. //***************添加黑名单*****************   
  91.     QGroupBox *groupBox3=new QGroupBox;  
  92.     QVBoxLayout *layout3=new QVBoxLayout(groupBox3);  
  93.     layout3->setMargin(10);  
  94.     layout3->setAlignment(Qt::AlignHCenter);  
  95.     layout3->addWidget(toolBtn3_1);  
  96.     layout3->addWidget(toolBtn3_2);  
  97.     layout3->addStretch();  
  98. //***************添加至主窗口*****************   
  99.     this->addItem((QWidget*)groupBox1,tr("我的好友"));  
  100.     this->addItem((QWidget*)groupBox2,tr("陌生人"));  
  101.     this->addItem((QWidget*)groupBox3,tr("黑名单"));  
  102. }  
图片自己找,然后放到了res文件夹中


如何处理QToolBox上QToolBoxButton的click事件?

Problem:
QToolBox,QTabWidget,QTabBar是通过currentChanged(int)这个signal来得到当前的currentIndex改变的。
Suppose在QToolBox上有3个QToolBoxButton, 每个QToolBoxButton下又有2个item,当我选中第二个QToolBoxButton下的任意一个item的时候,这时候QToolBox的currentIndex是1. 这时候再去点击current QToolBoxButton的时候,是没有currentChanged(int) signal发出的。如果我就是想处理点击同一个QToolBoxButton的情况呢?


可能你也想到了,得到QToolBoxButton的指针不就ok了吗?Unfortunately,类似于QTabBar上的Tab这个structure,QToolBox里的QToolBoxButton也是private,我们无法通过“正常途径"得到。

既然此路不通,就另辟蹊径,QObject的函数findChildren()可以出场了。。。

QList<T> QObject::findChildren ( const QString & name = QString() ) const

Returns all children of this object with the given name that can be cast to type T, or an empty list if there are no such objects. Omitting the name argument causes all object names to be matched. The search is performed recursively.

The following example shows how to find a list of child QWidgets of the specified parentWidget named widgetname:
         QList<QWidget *> widgets = parentWidget.findChildren<QWidget *>("widgetname");
This example returns all QPushButtons that are children of parentWidget:
         QList<QPushButton *> allPButtons = parentWidget.findChildren<QPushButton *>();


QToolBoxButton的base class是QAbstractButton,这些QToolBoxButton的objectName都是”qt_toolbox_QToolBoxButton“,因此,我们的代码可以这样写:
QList<QAbstractButton *> btnlist = findChildren<QAbstractButton*>(tr("qt_toolbox_QToolBoxButton"));

接下来的处理方式就有很多了,installEventFilter或者直接connect clicked() signal。。。
QAbstractButton* btn = NULL;
qint32 counter = btnlist.count();
for (qint32 i = 0; i < counter; i++)
{
    btn = btnlist.at(i);
    btn->installEventFilter(this); // method 1.
    // connect(btn, SIGNAL(clicked()), this, SLOT(toolboxbtnClicked())); // method 2.
}

举一反三,QT其他的很多widget的私有widget也可以通过这种方式获得。This is tricky. Yet, QT supplies us one method at least.

 



  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值