QT自定义MainWindow

1.开发环境:Qt 4.7.3 + MinGW 32bit (MSVC2015 32bit)

2.实现大纲:

          1)自定义边框,标题栏,工具栏,内容栏,状态栏(后面三个代码中没有实现实现)

          2)重写鼠标事件来控制可以自由移动框体

          3)样式文件使用qss实现,UI设计/数据/控制分离,方便二次开发

3.具体实现:

        1)通常情况下,linux或者window系统下的QMainwindow的边框样式比较原始不太美观,Qt提供了可以舍弃原有的边框,然后自定义。具体设置参数如下:

    setWindowFlags(Qt::FramelessWindowHint | Qt::WindowMinimizeButtonHint);   //配置边框属性,无边框
    setAttribute(Qt::WA_TranslucentBackground);    //设置背景半透明    

         2)关于框体中框线的样式设计,可以采用添加QFrame组件,通过设计QFrame的border相关属性来设置边框线,但是在设计的过程中发现,如果直接添加在mainwindow中添加QFrame组件,然后再设置border属性,发现border属性无效。解决方案可以在QMainwindow和QFrame之间添加一个QWidget作为“画布”,来显示QFrame的边框样式。

        3)一般来说,window的标题栏一般包括图标,标题大纲,隐藏/放大/还原/关闭等组件,因此可以添加一个QFrame + QHBoxLayout来配合实现,另外按钮推荐使用QToolButton(使用QPushButton也可以,但是需要设置setAutoDefault为false,否则会在设计Dialog弹框事埋下隐藏的bug,即关于enter按键的响应问题),并且设置其hover属性和tooltip(悬放时提示按钮功能)等属性。

       4)接下来需要重新定义鼠标的事件来实现鼠标拖拽mainwindow功能,主要是关于系统的四个函数的复写,通过坐标的决定坐标globalPos()和相对坐标pos()直接的变换来记录移动的距离,从而实现窗体的移动,具体如下:

    void mouseReleaseEvent(QMouseEvent *event);   //鼠标左键释放
    void mouseMoveEvent(QMouseEvent *event);      //鼠标左键一直按着,系统提供了event->buttons()来专门判断是否按着
    void mousePressEvent(QMouseEvent *event);             //鼠标左键按下, 且按下的坐标在标题栏上
    void mouseDoubleClickEvent(QMouseEvent *event);      //双击事件也就是完成标题栏上的放大按钮的相关功能

 

4.具体代码见下载地址:https://download.csdn.net/my/uploads

5.实现截图:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/382252.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

485. 最大连续1的个数 golang

Me func findMaxConsecutiveOnes(nums []int) int {max : 0for i,j : 0, -1; i < len(nums); i {if nums[i] 0 {j i} else {if max < i -j {max i - j}}}return max }

QTextEdit实现图片和文本同行显示

1.开发环境&#xff1a;Qt 4.7.3 MinGW 32bit (MSVC2015 32bit) 2.实现大纲&#xff1a; 1&#xff09;实现图片和文本在同一行显示&#xff0c;且能够设置字体大小和颜色 2&#xff09;能够手动设置行的宽度和间距 3&#xff09;设置字体样式&#xff0c;然后添加图片&#…

3. 无重复字符的最长子串 golang

官解 func lengthOfLongestSubstring(s string) int {n : len(s)ans : 0subMap : make(map[byte]int)for i, j : 0, 0; j < n; j {if v, ok : subMap[byte(s[j])]; ok {if i < v {i v}}if ans < (j - i 1) {ans j - i 1}subMap[byte(s[j])] j 1}return ans }

QQuickWidget + QML编程实现酷炫动态动画效果

1.具体需求&#xff1a;当Qt开发项目中需要实现简单的动态酷炫动画效果时&#xff0c;我们可以使用Qt中的QQuickWidget来实现&#xff0c;同时还可以使用QML编程来实现具体的动画效果&#xff0c;具体实现的效果如下所示&#xff1a; 2.具体操作和实现效果图&#xff1a; 1&am…

Qt中的四种信号与槽的连接方式

1. UI界面右键点击控件&#xff0c;选择“转到槽“&#xff0c;系统会在cpp中自动添加这个组件对应的槽函数 2.在Ui界面的下面 siga如l & slot editor栏中手动添加 3.在代码中使用connect显示添加 4. 使用on_对象名_事件名隐式连接&#xff0c;以QPushButton为例 QPushBut…

20. 有效的括号 golang 堆栈

借用arraystack的包完成 import "github.com/emirpasic/gods/stacks/arraystack"func isValid(s string) bool {stack : arraystack.New()for _, c : range s {if c ( {stack.Push())} else if c [ {stack.Push(])} else if c { {stack.Push(})} else {if stack.…

215. 数组中的第K个最大元素 golang

Me func findKthLargest(nums []int, k int) int {sort.Ints(nums)return nums[len(nums)-k] }golang实现快排和冒泡排序 1. bubbleSort // method2 func swap(a *int, b *int) {temp : *a*a *b*b temp }func bubbleSort(nums []int) {for i:0; i < len(nums); i {for…

Qt实现对json文件的解析

json是一种轻量级的数据结构&#xff0c;其内部的结构是一种键值对(key-value)的组合&#xff0c;最外层是{ }。key是带双引号的字符串常亮&#xff0c;用于获取和存储&#xff1b;value的值可以是bool变量&#xff0c;字符串常量&#xff0c;对象或数组(也是一个key-value的组…

解决QTreeWidget中item无法整行同时显示相同颜色

对于QTreeWidget来说&#xff0c;继承自QTreeView&#xff0c;因此设计QTreeWidget中的样式设计&#xff0c;归根结底是对QTreeView的样式设计&#xff0c;而对于QTreeView中item样式设计&#xff0c;可以分为对branch和item设计&#xff0c;另外QT Style Sheet可以通过设置sho…

279. 完全平方数 golang

Me func checkRecord(s string) bool {return !(strings.Count(s, "A") > 1 || strings.Contains(s, "LLL")) }golang的string用法 func EqualFold func EqualFold(s, t string) bool 判断两个utf-8编码字符串&#xff08;将unicode大写、小写、标题…

Qt自定义对话框中边框阴影实现

1. 对于Window系统或者Unix系统&#xff0c;QDialog有一个默认的边框(样式看起来有点复古)&#xff0c;不过Qt可以提供自定义的边框设计&#xff0c;通过设置对话框相关属性&#xff1a; setWindowFlags(Qt::Dialog | Qt:: FramelessWindowHint); //设置不适应默认边框 setAt…

344. 反转字符串 golang

Me 双指针操作。首指针和尾指针 func reverseString(s []byte) {left,right:0,len(s)-1for left < right && len(s) ! 0 {s[left],s[right]s[right],s[left]leftright--} }

Qt自定义数据类型注册meta-object system

在Qt项目开发过程中&#xff0c;有时候会碰到需要使用自定义数据类型作为信号或者槽的参数进行数据传输&#xff0c;由于信号或者槽中的参数必须为Qt meta-object 系统中能够识别的参数&#xff0c;但是自定义数据类型仅仅只是程序代码编写者自己知道&#xff0c;编译器在编译的…

Qt使用invokeMethod反射机制实现线程间的通信

对于Qt来说&#xff0c;UI线程是主线程&#xff0c;对于同一UI线程中对象的通信可以通过connect进行信号与槽关联来实现&#xff0c;但是当UI中对象A中的子线程B需要和另外UI对象C进行通信的时候&#xff0c;如果这个时候使用connect来进行通信的话,需要B对象和A对象进行关联将…

Qt eventFilter实现信号与槽

对于Qt来说&#xff0c;信号与槽机制是其通信的一大亮点&#xff0c;但是Qt中也提供了其他的方法实现数据间的通信&#xff0c;如invokeMethod反射机制实现通信(https://blog.csdn.net/xx18030637774/article/details/105017306),另外Qt还提供了使用eventFilter来实现数据通信&…

318. 最大单词长度乘积 golang

question 给定一个字符串数组 words&#xff0c;找到 length(word[i]) * length(word[j]) 的最大值&#xff0c;并且这两个单词不含有公共字母。你可以认为每个单词只包含小写字母。如果不存在这样的两个单词&#xff0c;返回 0。 示例 1: 输入: [“abcw”,“baz”,“foo”,“…

Qt编译错误:无法解析的外部符号 __imp__CloseServiceHandle __imp__OpenSCManager

在项目开发的过程&#xff0c;我在Qt的pro工程文件中添加了一个静态库&#xff0c;编译工程后报了这个错误&#xff0c;一开始以为是静态库有问题&#xff0c;验证之后发现静态库是正确的&#xff0c;最后才发现CloseServiceHandle和openSCManager这几个API都保存在系统库Advap…

242. 有效的字母异位词 golang

242. 有效的字母异位词 两个单词如果包含相同的字母&#xff0c;次序不同&#xff0c;则称为字母易位词(anagram) 思路 字符转换成bytebyte排序byte挨个对比 // 两个单词如果包含相同的字母&#xff0c;次序不同 func quickSort(arr []byte, left int, right int) {if left &…

leetcode验证冒泡排序效率

结论&#xff1a;快排比冒泡慢 bubbleSort leetcode_bubbleSort // 两个单词如果包含相同的字母&#xff0c;次序不同 func bubbleAsort(values []byte) {for i : 0; i < len(values)-1; i {for j : i1; j < len(values); j {if values[i]>values[j]{values[i],va…

QString转化为const char *出现乱码问题

对于Qt项目开发中&#xff0c;常常会遇到QString和const char*的转化问题&#xff0c;Qt也提供了响应的API接口&#xff0c;可以把QString转化为QByteArray&#xff0c;然后再转化为const char *,具体代码如下&#xff1a; QString string("helloWorld"); const cha…