双击目录树展示图片
页面布局
在ProTreeWidget的构造函数中添加双击信号的槽函数连接
1 | connect(this, &ProTreeWidget::itemDoubleClicked, this, &ProTreeWidget::SlotDoubleClickItem); |
接下来实现双击逻辑,判断为鼠标左键,就用一个成员变量_selected_item缓存双击的item,然后发送SigUpdateSelected信号通知右侧区域刷新显示。
1 | void ProTreeWidget::SlotDoubleClickItem(QTreeWidgetItem* doubleItem, int col){ |
之前在MainWindow的构造函数里添加了ProTree,这次我们要在添加一个PicShow类,PicShow类是我们新增的Qt设计师界面类,这里介绍它的ui内容。
1 在PicShow里添加一个网格布局,然后将PicShow设置为水平布局。
2 然后拖动一个QWidget放到PicShow左侧,再拖动一个QWidget放到PicShow的右侧,拖动一个label放到中间。
3 然后设置两个Widget的宽度都为固定的80像素。将两个widget设置为垂直布局,然后分别添加一个button。
4 拖放两个水平的spacer和垂直的spacer分别放在label的上下左右,保证label居中。
效果如下
ui信息
然后在MainWindow里添加PicShow
1 | _protree = new ProTree(); |
同时我们为PicShow新增qss文件
1 | PicShow { |
自定义按钮
现在需要实现按钮的悬浮,点击效果,所以需要继承QPushButton,实现我们自己定义的按钮类PicButton。
添加C++类PicButton,基类选择QPushButton。
实现一个设置图标的函数,参数分别为正常状态,悬浮状态,以及按下状态的效果
1 | void PicButton::SetIcons(const QString &normal, const QString &hover, const QString &pressed) |
重载event函数,实现根据事件类型刷新按钮样式的逻辑
1 | bool PicButton::event(QEvent *event) |
设置按钮样式的函数很简单,都是通过QPixmap加载的。
1 | void PicButton::setNormalIcon(){ |
所以回到picshow.ui中,将两个QPushButton升级为PicButton。
这样我们在界面上将鼠标在按钮上点击和悬浮等就能看到效果了。
按钮的渐隐动画
接下来我们要实现将鼠标滑动到PicShow区域才显示前进和后退按钮,滑出PicShow区域则不显示。
为使按钮实现渐隐渐现的效果,所以我们通过动画实现。在PicShow的构造函数里创建两个渐隐渐现的动画,将效果绑定到两个按钮上。
1 | QGraphicsOpacityEffect *opacity_pre = new QGraphicsOpacityEffect(this); |
除此之外还重写PicShow的event函数,捕获其中的enter和leave事件
1 | bool PicShow::event(QEvent *event) |
根据enter还是leave设置按钮显示和隐藏。显示隐藏的函数通过bool参数控制,根据是否可见并且是否隐藏综合控制动画。
1 | void PicShow::ShowPreNextBtns(bool b_show) |
这样鼠标滑动和移出PicShow区域就能显示和隐藏button了。
双击左侧目录树实现图片切换
为ProTreeWidget绑定双击的槽函数,并且实现双击后发送信号通知PicShow显示图片
ProTreeWidget构造函数添加
1 | connect(this, &ProTreeWidget::itemDoubleClicked, this, &ProTreeWidget::SlotDoubleClickItem); |
双击逻辑
1 | void ProTreeWidget::SlotDoubleClickItem(QTreeWidgetItem* doubleItem, int col){ |
在mainwindow构造函数中添加信号连接
1 | auto * pro_pic_show = dynamic_cast<PicShow*>(_picshow); |
在PicShow里实现SlotSelectItem显示选中图像
1 | void PicShow::SlotSelectItem(const QString& path) |
这样就实现了点击左侧不同的目录树item显示不同的图片。
图像重绘
因为每次图像形状不同,都会导致重回,这样会造成资源浪费,所以将重回事件写在MainWindow,只在MainWindow改变时重绘
1 | void MainWindow::resizeEvent(QResizeEvent *event) |
picshow实现重新加载逻辑
1 | void PicShow::ReloadPic() |
qss样式补充
因为目录树双击选中效果,悬浮,以及折叠等效果,我们补充一下qss.
以及按钮需要设置为无边框效果
1 | PicShow { |
前进后退按钮切换图片
在picshow的构造函数中绑定按钮点击信号
1 | connect(ui->nextBtn,&QPushButton::clicked,this, &PicShow::SigNextClicked); |
当按钮点击后左侧目录树的选中条目也进行更新,所以在MainWindow构造函数中
1 | connect(pro_pic_show, &PicShow::SigPreClicked,pro_tree_widget,&ProTreeWidget::SlotPreShow); |
ProTreeWidget的更新逻辑, 设置选中item,并且发送更新图片信号。
1 | void ProTreeWidget::SlotPreShow(){ |
SigUpdatePic信号会被PicShow的SlotUpdatePic函数绑定,该函数实现了图片的切换展示。
1 | void PicShow::SlotUpdatePic(const QString &_path) |
关闭和激活项目
前文提到了我们要实现关闭项目的功能,在这里补充一下。ProTreeWidget的构造函数添加
1 | _action_setstart = new QAction(QIcon(":/icon/core.png"), tr("设置活动项目"),this); |
关闭项目的槽函数中现弹出一个删除对话框,这个也是我们添加的设计师界面类,不再赘述了。
删除对话框的布局ui是这样的
可以勾选同时删除本地文件夹项目文件,这样我们的程序也会把copy的文件删除。
关闭项目逻辑如下
1 | void ProTreeWidget::SlotClosePro() |
判断当前选中的item是否在删除的项目中,如果在则发送SigClearSelected信号。
如果是设置活动项目,我们只需要在槽函数里设置字体变粗即可。
1 | void ProTreeWidget::SlotSetActive() |
到目前为止我们点击按钮和item等切换图片的功能就实现了,下一篇实现幻灯片放映。