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.
下面展示类似聊天软件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.
相关文章推荐
- Qt学习——聊天的QQ列表QToolBox类
- Qt学习——聊天的QQ列表QToolBox类
- Qt学习——聊天的QQ列表QToolBox类
- Qt学习——聊天的QQ列表QToolBox类 .
- QT学习 第一章:基本对话框--实现QQ抽屉效果
- 基于Qt的类QQ气泡聊天的界面开发
- JAVA学习第六十课 — UDP协议 &基于多线程模拟简单的QQ聊天程序
- Calendar 显示是否是 今天 本周 本月 本年 (应用于微信 QQ 显示历史聊天列表 时间显示)
- QQ好友的列表恢复与聊天记录的恢复
- 基于Qt的类QQ气泡聊天的界面开发(二)
- Android开发学习之QQ好友列表的实现
- QT学习 之 主窗口 (六) QToolBox类(抽屉效果)
- (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画
- Qt实现QQ好友下拉列表
- 自定义listview 实现仿qq聊天列表左滑删除效果
- Qt模仿安卓QQ聊天界面
- Qt程序聊天弹屏问题简单解决方法(类似QQ聊天聊天窗口弹屏)
- QT下自定义QQ聊天窗口tab控件
- 基于Qt的类似QQ好友列表抽屉效果的实现
- 仿手机QQ聊天列表滑动菜单删除和手势滑动返回的两种方式