您的位置:首页 > 编程语言 > Qt开发

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

2014-09-04 22:46 169 查看
QToolBox展示出来的抽屉效果可以设计联系人列表

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



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

view
plaincopy
to clipboard

#include <QToolBox>

#include <QToolButton>

class Drawer : public QToolBox

{

Q_OBJECT

public:

Drawer(QWidget *parent=0,Qt::WindowFlags f=0);

private:

QToolButton *toolBtn1_1;

QToolButton *toolBtn1_2;

QToolButton *toolBtn1_3;

QToolButton *toolBtn1_4;

QToolButton *toolBtn1_5;

QToolButton *toolBtn2_1;

QToolButton *toolBtn2_2;

QToolButton *toolBtn3_1;

QToolButton *toolBtn3_2;

};

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

view
plaincopy
to clipboard

#include "drawer.h"

#include <QGroupBox>

#include <QVBoxLayout>

Drawer::Drawer(QWidget *parent,Qt::WindowFlags f)

:QToolBox(parent,0)

{

setWindowTitle(tr("My QQ"));

//***************初始化我的好友*****************

toolBtn1_1=new QToolButton;

toolBtn1_1->setText(tr("张三"));

toolBtn1_1->setIcon(QPixmap("res/11.bmp"));

toolBtn1_1->setIconSize(QPixmap("res/11.bmp").size());

toolBtn1_1->setAutoRaise(TRUE);

toolBtn1_1->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);



toolBtn1_2=new QToolButton;

toolBtn1_2->setText(tr("李四"));

toolBtn1_2->setIcon(QPixmap("res/12.bmp"));

toolBtn1_2->setIconSize(QPixmap("res/12.bmp").size());

toolBtn1_2->setAutoRaise(TRUE);

toolBtn1_2->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);



toolBtn1_3=new QToolButton;

toolBtn1_3->setText(tr("王五"));

toolBtn1_3->setIcon(QPixmap("res/13.bmp"));

toolBtn1_3->setIconSize(QPixmap("res/13.bmp").size());

toolBtn1_3->setAutoRaise(TRUE);

toolBtn1_3->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);



toolBtn1_4=new QToolButton;

toolBtn1_4->setText(tr("小赵"));

toolBtn1_4->setIcon(QPixmap("res/14.bmp"));

toolBtn1_4->setIconSize(QPixmap("res/14.bmp").size());

toolBtn1_4->setAutoRaise(TRUE);

toolBtn1_4->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);



toolBtn1_5=new QToolButton;

toolBtn1_5->setText(tr("小孙"));

toolBtn1_5->setIcon(QPixmap("res/15.bmp"));

toolBtn1_5->setIconSize(QPixmap("res/15.bmp").size());

toolBtn1_5->setAutoRaise(TRUE);

toolBtn1_5->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);

//***************添加我的好友*****************

QGroupBox *groupBox1=new QGroupBox;

QVBoxLayout *layout1=new QVBoxLayout(groupBox1);

layout1->setMargin(10);

layout1->setAlignment(Qt::AlignHCenter);

layout1->addWidget(toolBtn1_1);

layout1->addWidget(toolBtn1_2);

layout1->addWidget(toolBtn1_3);

layout1->addWidget(toolBtn1_4);

layout1->addWidget(toolBtn1_5);

layout1->addStretch();

//***************陌生人*********************

toolBtn2_1=new QToolButton;

toolBtn2_1->setText(tr("小王"));

toolBtn2_1->setIcon(QPixmap("res/21.bmp"));

toolBtn2_1->setIconSize(QPixmap("res/21.bmp").size());

toolBtn2_1->setAutoRaise(TRUE);

toolBtn2_1->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);



toolBtn2_2=new QToolButton;

toolBtn2_2->setText(tr("小张"));

toolBtn2_2->setIcon(QPixmap("res/22.bmp"));

toolBtn2_2->setIconSize(QPixmap("res/22.bmp").size());

toolBtn2_2->setAutoRaise(TRUE);

toolBtn2_2->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);

//***************添加陌生人*****************

QGroupBox *groupBox2=new QGroupBox;

QVBoxLayout *layout2=new QVBoxLayout(groupBox2);

layout2->setMargin(10);

layout2->setAlignment(Qt::AlignHCenter);

layout2->addWidget(toolBtn2_1);

layout2->addWidget(toolBtn2_2);

layout2->addStretch();

//***************黑名单*********************

toolBtn3_1=new QToolButton;

toolBtn3_1->setText(tr("小王"));

toolBtn3_1->setIcon(QPixmap("res/31.bmp"));

toolBtn3_1->setIconSize(QPixmap("res/31.bmp").size());

toolBtn3_1->setAutoRaise(TRUE);

toolBtn3_1->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);



toolBtn3_2=new QToolButton;

toolBtn3_2->setText(tr("小张"));

toolBtn3_2->setIcon(QPixmap("res/32.bmp"));

toolBtn3_2->setIconSize(QPixmap("res/32.bmp").size());

toolBtn3_2->setAutoRaise(TRUE);

toolBtn3_2->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);

//***************添加黑名单*****************

QGroupBox *groupBox3=new QGroupBox;

QVBoxLayout *layout3=new QVBoxLayout(groupBox3);

layout3->setMargin(10);

layout3->setAlignment(Qt::AlignHCenter);

layout3->addWidget(toolBtn3_1);

layout3->addWidget(toolBtn3_2);

layout3->addStretch();

//***************添加至主窗口*****************

this->addItem((QWidget*)groupBox1,tr("我的好友"));

this->addItem((QWidget*)groupBox2,tr("陌生人"));

this->addItem((QWidget*)groupBox3,tr("黑名单"));

}

图片自己找,然后放到了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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: