用Qt写软件系列五:一个安全防护软件的制作(2)
来源:互联网 发布:卸载360游戏优化器 编辑:程序博客网 时间:2024/05/16 17:05
引言
在上一篇中讲述了主窗体的创建和设计。主窗体的无边框效果、阴影效果、拖动事件处理、窗体美化等工作在前面的博客中早就涉及,因此上篇博文中并未花费过多笔墨。这一篇继续讲述工具箱(Tool Button)的实现。另外,在实现的过程中还做了另外一个贴心的小功能:可伸缩的侧边栏。不过后来发现应用起来后效果不佳,于是就没在主窗体中加入这个功能了,单独做了一个demo作为示范。
工具箱的实现
工具箱是将若干的工具按钮组织在一起,为用户提供简便导航功能的一个组件。在Qt中实现这个功能不难,Qt库本身就提供了QToolButton和QToolBox两个类用于类似功能。在这里我们从QToolButton类派生一个子类自定义按钮动作。QToolButton类本身只提供了一些基本功能。因此我们需要实现一些事件处理器来自定义工具按钮的动作和外观。
看码说话:
在该子类中我们重写了enterEvent(),leaveEvent(), paintEvent(), mousePressEvent()这几个事件处理函数。分别对应鼠标进入、离开、点击按钮区域事件,paintEvent()则用于绘制按钮的外观。此外,还是用了几个状态变量,用于记录鼠标当前的移动状态。利用这些状态,我们就能顺利实现不同状态的外观绘制。值得注意的是doPaintStuff()这个函数。这个函数实际做的工作是给工具按钮添加垂直的渐变效果。使用了QLinearGradient这个类,可以实现线性的渐变效果,这在很多界面元素设计中都非常有用。
在主函数中怎么调用这个自定义的按钮类呢?
MainWin::MainWin(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(
this
);
setWindowTitle(
"Tool Button"
);
QStringList string_list;
string_list<<
":/toolWidget/tiJian"
<<
":/toolWidget/muMa"
<<
":/toolWidget/repair"
<<
":/toolWidget/qingLi"
<<
":/toolWidget/jiaSu"
<<
":/toolWidget/expert"
<<
":/toolWidget/menZhen"
<<
":/toolWidget/gongNeng"
;
QVBoxLayout *layout =
new
QVBoxLayout(
this
);
QHBoxLayout *button_layout =
new
QHBoxLayout(
this
);
QSignalMapper *signal_mapper =
new
QSignalMapper(
this
);
for
(
int
i=0; i< string_list.size(); i++)
{
CustomToolButton *tool_button =
new
CustomToolButton(string_list.at(i));
tool_button->setText(
"Test"
);
button_list.append(tool_button);
connect(tool_button, SIGNAL(clicked()), signal_mapper, SLOT(map()));
signal_mapper->setMapping(tool_button, QString::number(i, 10));
button_layout->addWidget(tool_button, 0, Qt::AlignBottom);
}
layout->addLayout(button_layout);
layout->addStretch();
setLayout(layout);
}
从代码中看,我们用了一个循环生成了若干个自定义按钮,然后全部放到水平布局管理器中进行管理。这个很容易理解,重点内容是QSignalMapper类的应用。QSignalMapper类是一个工具类,它主要的功能是将一组无参数信号集中管理,将信号用整型值或字符串值表示,然后再以一种统一的形式发送出去。其好处是,当有很多的信号需要统一管理的时候非常方便,不用手动调用connect()为信号绑定槽函数,因此代码结构也更为简练。在上面的代码中,我们将按钮点击信号转换为数值形式表示。这样也是很自然的做法,一方面形式简单,另一方面水平排列的工具按钮按序编号符合人类习惯。
可伸缩的侧边栏
还是看看什么叫做可伸缩的侧边栏,这样的功能在QQ的聊天窗口就可以看见:
侧边栏的收缩可以在需要的时候隐藏部分组件,从而为其他组件提供更为广阔的视角。如上图中的侧边栏收缩为文本框组件提供更多的空间,整个界面上看起来也更为清爽。稍微一剖析:这个边栏要能点击,点击之后要切换图标,响应的组件要隐藏。如此一分析,代码可如下编写:
可以发现这里的侧边栏果然一直固定在最左侧,要达到QQ聊天界面那要的效果呢,只需要改几行代码就好了:
TestSideBar::TestSideBar(QWidget *parent)
: QMainWindow(parent)
{
// 其他保持不变,省略……
mainSplitter->addWidget(leftWidget);
mainSplitter->addWidget(zoomButton);
mainSplitter->addWidget(rightWidget);
mainLayout->addWidget(mainSplitter, 1);
mainLayout->setSpacing(0);
mainLayout->setContentsMargins(0, 0, 0, 0);
// 其他保持不变,省略……
}
小结
这一篇主要讲了上篇遗留的一个功能,工具按钮组的开发。另外,实现了另外一个功能:侧边栏的伸缩。下一篇继续树形控件(tree widget)、堆栈式窗口布局(stacked layout)的讲解。
转载自:http://www.cnblogs.com/csuftzzk/p/Trojan_Assessment_Platform_2.html
- 用Qt写软件系列五:一个安全防护软件的制作(2)
- 用Qt写软件系列五:一个安全防护软件的制作(1)
- 用Qt写软件系列五:一个安全防护软件的制作(3)
- 用Qt写软件系列三:一个简单的系统工具(上)
- 用Qt写软件系列三:一个简单的系统工具之界面美化
- 用Qt写软件系列三:一个简单的系统工具之界面美化
- Qt写的一个截图软件
- 电脑安全防护软件摘要
- 收集的13个杀毒软件和安全防护软件(有图哦)
- 用Qt写软件系列四:定制个性化系统托盘菜单
- 用Qt写软件系列四:定制个性化系统托盘菜单
- 自动化软件安全防护解决方案实例介绍
- 软件常用安全防护手段 checksec 总结
- 一个在线音乐软件的故事(五、让我们开始写代码吧)
- Qt系列软件
- 用C++ Builder的MD5控件实现软件防护
- 用C++ Builder的MD5控件实现软件防护
- InstallShield制作软件安装包:在安装过程中启动一个c#写的程序
- html5学习笔记五--表单
- x64 win7系统下VS2010运行显示图片程序,出现错误:fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
- 黑马程序员——JAVA基础之开发前奏,基础知识了解
- Xcode SBTarget is invalid的解决办法
- apache+tomcat+mod_jk load balance
- 用Qt写软件系列五:一个安全防护软件的制作(2)
- cocos2dx 内存优化
- Linux 使用 cp 命令强制覆盖功能
- Web前端研发工程师编程能力飞升之路
- 在linux上开关swap
- Android之Dialog分析
- 用Qt写软件系列五:一个安全防护软件的制作(3)
- 简单之文件存储管理
- 第九周上机项目三(f)输出星号图