qss设置按钮三态问题 !!!急

qq_35382927 2018-08-03 02:43:26
rt ,最近在linux下开发qt界面,发现有个很严重影响使用的问题!!就按钮设置了qss三态后(hover,pressed)后,如果弹出一个模态对话框,关闭模态对话框后,鼠标如果不重新移回三态的btn上,那个btn就会一直显示hover下状态!!!开始我以为qss中的hover效果是在控件的leave事件中触发的 重写了事件,还是没有用!!!这个感觉做界面开发的,很影响使用啊,请问高手有遇到这种情况并且解决的吗??关闭模态框后也repaint update了 都试过,木有用!!
另外发现linux下qt开发有时候界面跳转会卡顿!!比如一个stackwidget index间切换,如果不给page设置boder-image的背景样式,就不会卡,一设置背景图,就会有明显卡顿!!请问这是和linux下内存cpu处理性能有关系么,因为确实很影响使用!!(复杂操作都放异步进行,主进程只做ui处理,页面跳转仍会卡)
...全文
946 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
WanMoon 2018-10-11
  • 打赏
  • 举报
回复
引用 18 楼 qq_20408527 的回复:
[quote=引用 17 楼 ljq19930523 的回复:]
[quote=引用 11 楼 qq_20408527 的回复:]
QSS 的确有这个问题,我做界面的时候也遇到了,用了比较蠢的解决方法:Clicked的时候隐藏掉按钮再打开模态对话框,关闭对话框的时候再show出来。发现确实有用,只不过一点击按钮就消失了。 另外按钮还有个状态叫 isDown,我记得应该是按钮停在了Down。还是去年刚入门的时候碰到和解决的,后来没做了就没深入研究。

我也遇到了一模一样的问题,我查看关闭模态对话框后的按钮状态,isDown返回false,所以不是按钮停留在Down导致的。由于弹出对话框时,对话框没有遮挡住按钮,所以不能使用隐藏按钮的方法。不知道楼主现在解决没,可否分享一下,我用的qt4.8.6版本,在海思3531a开发板上运行qt应用。[/quote]

啊,这样啊,不好意思了。我也是之前做NVR的时候遇到的,我当时用了两种方法盖过去的,一种就是上述的隐藏,另一种现在记不起来了。可以尝试一下设置不同的状态显示不同的颜色,QSS可以设置focus,pressed,hove,常态。 哦,好像另一种就是关闭模态对话框的时候设置按钮为 NoFocus?我现在没有板子没办法尝试[/quote]
我在Stack Overflow上找到了解决办法:
https://stackoverflow.com/questions/25318538/qt-qpushbutton-stylesheet-hover
说是Qt的一个BUG,Qt::WA_UnderMouse属性没有正确设置,一直为true,可以用underMouse()方法查看属性值,如:
qDebug()<< "m_pBtnSerialPortSet->underMouse() = "<<m_pBtnSerialPortSet->underMouse();
可以用setAttribute ( Qt::WidgetAttribute attribute, bool on = true )方法修改该属性,如:
m_pSerialPortDlg->exec();
m_pBtnSerialPortSet->setAttribute(Qt::WA_UnderMouse,false);
这样就可以解决了。
  • 打赏
  • 举报
回复
引用 17 楼 ljq19930523 的回复:
[quote=引用 11 楼 qq_20408527 的回复:]
QSS 的确有这个问题,我做界面的时候也遇到了,用了比较蠢的解决方法:Clicked的时候隐藏掉按钮再打开模态对话框,关闭对话框的时候再show出来。发现确实有用,只不过一点击按钮就消失了。 另外按钮还有个状态叫 isDown,我记得应该是按钮停在了Down。还是去年刚入门的时候碰到和解决的,后来没做了就没深入研究。

我也遇到了一模一样的问题,我查看关闭模态对话框后的按钮状态,isDown返回false,所以不是按钮停留在Down导致的。由于弹出对话框时,对话框没有遮挡住按钮,所以不能使用隐藏按钮的方法。不知道楼主现在解决没,可否分享一下,我用的qt4.8.6版本,在海思3531a开发板上运行qt应用。[/quote]

啊,这样啊,不好意思了。我也是之前做NVR的时候遇到的,我当时用了两种方法盖过去的,一种就是上述的隐藏,另一种现在记不起来了。可以尝试一下设置不同的状态显示不同的颜色,QSS可以设置focus,pressed,hove,常态。 哦,好像另一种就是关闭模态对话框的时候设置按钮为 NoFocus?我现在没有板子没办法尝试
WanMoon 2018-08-09
  • 打赏
  • 举报
回复
引用 11 楼 qq_20408527 的回复:
QSS 的确有这个问题,我做界面的时候也遇到了,用了比较蠢的解决方法:Clicked的时候隐藏掉按钮再打开模态对话框,关闭对话框的时候再show出来。发现确实有用,只不过一点击按钮就消失了。 另外按钮还有个状态叫 isDown,我记得应该是按钮停在了Down。还是去年刚入门的时候碰到和解决的,后来没做了就没深入研究。

我也遇到了一模一样的问题,我查看关闭模态对话框后的按钮状态,isDown返回false,所以不是按钮停留在Down导致的。由于弹出对话框时,对话框没有遮挡住按钮,所以不能使用隐藏按钮的方法。不知道楼主现在解决没,可否分享一下,我用的qt4.8.6版本,在海思3531a开发板上运行qt应用。
qq_35382927 2018-08-07
  • 打赏
  • 举报
回复
引用 15 楼 qq_20408527 的回复:
跟板子性能有关系,跟内存大小也有关系,也跟Qt有关系。我在海思上做的,别说动画了,我做了个图片查看器,放大到一定倍数就直接崩了。界面过大意味着需要重绘的区域也越大。大到一定程度的时候鼠标都会卡顿。因为鼠标移动也会刷新界面。同时加载过多控件也会卡顿。在板子上跑的话什么都要精打细算的样子。关于如何解决这些卡顿问题我暂时也没有很好的方法,只能尽量绕过去
好的谢谢!
qq_35382927 2018-08-06
  • 打赏
  • 举报
回复
引用 13 楼 qq_20408527 的回复:
另外QSS挺好用的,能满足大部分需求,比自定义的用起来简单。我自己做的界面一般样式用QSS,图标用Paint自己画,哈哈,很有趣但是不推荐,比较繁琐,画个放大镜都要算坐标
谢谢大神,大神有遇到过linux下qt界面开发卡顿情况吗,我的是在海图的开发板上开发界面,加个程序启动动画都cpu飙升,卡的要死,界面跳转如果界面过大,也会有这种情况,请问这是板子性能问题吗
  • 打赏
  • 举报
回复
另外QSS挺好用的,能满足大部分需求,比自定义的用起来简单。我自己做的界面一般样式用QSS,图标用Paint自己画,哈哈,很有趣但是不推荐,比较繁琐,画个放大镜都要算坐标
  • 打赏
  • 举报
回复
按照你之前的写法,模态对话框关闭后 hide+show repaint update通通没有用的,我的理解是按钮本身的状态被停留在Down,你刷新的只是绘制,绘制是根据状态来的所以怎么刷新也是没有用的。
  • 打赏
  • 举报
回复
QSS 的确有这个问题,我做界面的时候也遇到了,用了比较蠢的解决方法:Clicked的时候隐藏掉按钮再打开模态对话框,关闭对话框的时候再show出来。发现确实有用,只不过一点击按钮就消失了。 另外按钮还有个状态叫 isDown,我记得应该是按钮停在了Down。还是去年刚入门的时候碰到和解决的,后来没做了就没深入研究。
qq_35382927 2018-08-06
  • 打赏
  • 举报
回复
引用 7 楼 a137748099 的回复:
引用 4 楼 qq_35382927 的回复:
[quote=引用 3 楼 a137748099 的回复:]
那就不用qss啊,派生于QWidget自定义三态的控件,使用mousePressEvent、mouseReleaseEvent、enterEvent、leaveEvent设置不同的背景图或颜色对paintEvent进行update,自定义的会好用过很多
自己重写事件实现三态样式的话,具体怎么解决这个问题呢?? 因为弹出模态对话框的时候,是不会检测到btn的leaveEvent啊,都被屏蔽了

那你就给这个控件添加个接口设置正常状态的啊,弹框的时候调用这个接口设置为正常状态的显示[/quote]好的 这个我去试试,请问大神知道下面那个问题吗,linux qt界面卡顿的问题
qq_35382927 2018-08-06
  • 打赏
  • 举报
回复
引用 8 楼 qq_40450386 的回复:
没注意这个情况@~!试试自定义吧!~
楼主解决了的话说说@!
自定义是如何的?和楼上说的自己重写leave enter事件来实现按钮三态么
  • 打赏
  • 举报
回复
跟板子性能有关系,跟内存大小也有关系,也跟Qt有关系。我在海思上做的,别说动画了,我做了个图片查看器,放大到一定倍数就直接崩了。界面过大意味着需要重绘的区域也越大。大到一定程度的时候鼠标都会卡顿。因为鼠标移动也会刷新界面。同时加载过多控件也会卡顿。在板子上跑的话什么都要精打细算的样子。关于如何解决这些卡顿问题我暂时也没有很好的方法,只能尽量绕过去
不易易 2018-08-04
  • 打赏
  • 举报
回复
没注意这个情况@~!试试自定义吧!~ 楼主解决了的话说说@!
芒果黑 2018-08-03
  • 打赏
  • 举报
回复
引用 4 楼 qq_35382927 的回复:
引用 3 楼 a137748099 的回复:
那就不用qss啊,派生于QWidget自定义三态的控件,使用mousePressEvent、mouseReleaseEvent、enterEvent、leaveEvent设置不同的背景图或颜色对paintEvent进行update,自定义的会好用过很多
自己重写事件实现三态样式的话,具体怎么解决这个问题呢?? 因为弹出模态对话框的时候,是不会检测到btn的leaveEvent啊,都被屏蔽了

那你就给这个控件添加个接口设置正常状态的啊,弹框的时候调用这个接口设置为正常状态的显示
qq_35382927 2018-08-03
  • 打赏
  • 举报
回复
引用 5 楼 weixin_42874466 的回复:
新手表示看不懂
共同学习,加油
weixin_42874466 2018-08-03
  • 打赏
  • 举报
回复
新手表示看不懂
qq_35382927 2018-08-03
  • 打赏
  • 举报
回复
引用 3 楼 a137748099 的回复:
那就不用qss啊,派生于QWidget自定义三态的控件,使用mousePressEvent、mouseReleaseEvent、enterEvent、leaveEvent设置不同的背景图或颜色对paintEvent进行update,自定义的会好用过很多
自己重写事件实现三态样式的话,具体怎么解决这个问题呢?? 因为弹出模态对话框的时候,是不会检测到btn的leaveEvent啊,都被屏蔽了
芒果黑 2018-08-03
  • 打赏
  • 举报
回复
那就不用qss啊,派生于QWidget自定义三态的控件,使用mousePressEvent、mouseReleaseEvent、enterEvent、leaveEvent设置不同的背景图或颜色对paintEvent进行update,自定义的会好用过很多
qq_35382927 2018-08-03
  • 打赏
  • 举报
回复
qq_35382927 2018-08-03
  • 打赏
  • 举报
回复
有大神解惑下吗

16,175

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧