ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

初识Qt——常用控件之QWidget属性_1

初识Qt——常用控件之QWidget属性_1 1. 控件概述控件Widget也常译为部件或窗口部件是Qt中所有用户界面元素的基础。在Qt中控件就是一个继承自QWidget的类。QWidget是所有控件的基类它提供了绘制自身的能力paintEvent处理鼠标/键盘事件的能力mousePressEvent、keyPressEvent管理子控件的能力父子关系、布局与用户交互的能力信号槽// 几乎所有界面元素都是 QWidget 的子类QWidget // 基类├── QAbstractButton│ ├── QPushButton // 按钮│ ├── QCheckBox // 复选框│ └── QRadioButton // 单选按钮├── QLineEdit // 单行输入框├── QTextEdit // 多行文本框├── QComboBox // 下拉框├── QSlider // 滑块├── QProgressBar // 进度条├── QLabel // 标签└── ... (上百种控件)所以下面我们来了解一下QWidget这个类的相关属性。双击界面文件后选中一个控件我们就能在右下角黄色部分看到QWidget相关属性在这里也可以直接对这些属性进行修改这些属性不用每个都去了解我们主要去了解常用和重要的下面一一介绍2. QWidget的enabled属性enable属性描述了一个控件是否处于“可用”状态。不可用即禁用所谓禁用就是该控件不能接受任何用户的输入事件并且外观上往往是灰色的如果一个widget被禁用则该widget的子元素也被禁用。相关API:bool isEnabled(); 获取到控件的可用状态void setEnabled (bool); 设置控件是否可用代码示例用一个按钮来改变另一个按钮可用性//widget.cpp #include widget.h #include ui_widget.h #include QPushButton #include QMessageBox Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui-setupUi(this); } Widget::~Widget() { delete ui; } void Widget::on_pushButton_clicked() { QMessageBox::information(this, 提示, 按钮可用); } void Widget::on_toggle_enable_clicked() { //先获取按钮可用信息 bool enable ui-pushButton-isEnabled(); //修改按钮可用性 if(enable) { ui-pushButton-setEnabled(false); } else { ui-pushButton-setEnabled(true); } }运行结果3. QWidget的geometry属性geometry直接可译为几何。在这里可以理解为位置和尺寸也就是x、y、height、width的总称。相关APIQRect geometry(); 获取到控件的位置和尺寸,返回结果是⼀个 QRect, 包含了 x, y,width, height其中 x, y 是左上角的坐标void setGeometry(QRect); 设置控件的位置和尺寸可以直接设置⼀个 QRectvoid setGeometry(int x, int y,int width, int height); 也可以分四个属性单独设置我们之前用到的move只可以修改位置这里的setGeometry既可以修改位置也可以修改尺寸。代码示例//widget.cpp #include widget.h #include ui_widget.h Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui-setupUi(this); } Widget::~Widget() { delete ui; } void Widget::on_Up_clicked() { //获取按钮的geometry QRect rect ui-pushButton-geometry(); //修改按钮位置 //方法1——这种方法会导致按钮形状发生改变因为只是改变了按钮左上角坐标 //rect.setY(rect.y()-10); //ui-pushButton-setGeometry(rect); //方法2 ui-pushButton-setGeometry(rect.x(),rect.y()-10,rect.width(),rect.height()); } void Widget::on_Left_clicked() { QRect rect ui-pushButton-geometry(); ui-pushButton-setGeometry(rect.x()-10,rect.y(),rect.width(),rect.height()); } void Widget::on_Down_clicked() { QRect rect ui-pushButton-geometry(); ui-pushButton-setGeometry(rect.x(),rect.y()10,rect.width(),rect.height()); } void Widget::on_Right_clicked() { QRect rect ui-pushButton-geometry(); ui-pushButton-setGeometry(rect.x()10,rect.y(),rect.width(),rect.height()); } void Widget::on_Big_clicked() { QRect rect ui-pushButton-geometry(); ui-pushButton-setGeometry(rect.x(),rect.y(),rect.width()5,rect.height()5); } void Widget::on_Small_clicked() { QRect rect ui-pushButton-geometry(); ui-pushButton-setGeometry(rect.x(),rect.y(),rect.width()-5,rect.height()-5); }我们可以通过上下左右大小六个按钮去控制按钮w的移动和变化补充Window Frame的影响Window Frame窗口框架它指的就是操作系统为应用程序窗口添加的那一层“装饰”。你可以把Window Frame想象成现实窗户的“窗框”标题栏最上方显示窗口标题包含最小化、最大化、关闭按钮。边框窗口四周可以用鼠标拖拽来改变窗口大小。而你的Qt程序界面按钮、文本框等则是被这个“窗框”包裹在里面的“玻璃”。这个“窗框”由操作系统负责绘制和管理并不是Qt程序本身控制的不同系统下的外观也不同。Window Frame的核心影响坐标与尺寸计算它的主要影响体现在Qt提供的众多获取/设置窗口位置和尺寸的API上。这些API被明确地分成了两派计算方式代表API说明包含Window FrameframeGeometry(),x(),y(),pos(),move(),frameSize()计算时原点位于窗口框架的左上角尺寸包含标题栏和所有边框。不包含Window Framegeometry(),setGeometry(),width(),height(),rect(),size()计算时原点位于客户区你的程序界面的左上角尺寸只包含内部的客户区不包含边框和标题栏。简单来说使用frameGeometry()得到的是整个“窗户”的位置和大小而使用geometry()得到的是“玻璃”你的程序界面的位置和大小。4. QWidget的windowTitle和windowlcon属性4.1 windowTitle属性作用设置或获取窗口标题栏上显示的文字。相关APIconst QString windowTitle() 获取控件的窗口标题void setWindowTitle(const QString) 设置控件的窗口标题代码示例//widget.cpp #include widget.h #include ui_widget.h #include QDebug Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui-setupUi(this); this-setWindowTitle(我是窗口); const QString title this-windowTitle(); qDebug()title; } Widget::~Widget() { delete ui; }运行结果4.2 windowIcon属性作用设置或获取窗口标题栏左侧以及任务栏、AltTab切换界面显示的小图标。相关APIQIcon windowIcon(); 获取控件的窗口图标void setWindowIcon(const QIcon) 设置控件的窗口图标代码示例//widget.cpp #include widget.h #include ui_widget.h #includeQIcon Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui-setupUi(this); this-setWindowIcon(QIcon(E:/mountain.png)); } Widget::~Widget() { delete ui; }注意路径不能带中文Windows 下路径的分隔符可以使用 /也可以使用\ 但是如果在字符串中使用 \转义字符 需要写作转义字符的形式 \\ 因此还是更推荐使用/ 。在C11中有一个raw string专门解决上述转义字符的问题也就是在raw string 中所有字符都视为普通字符不涉及转义。运行结果5. qrc机制在实际开发中像前面这样设置图标时直接设置这种绝对路径是不合理的。因为我们写出来的程序最终是要给客户使用的而客户电脑上的图片路径不一定和我们电脑上的路径一致所以相对路径是更好的方案但是单纯的相对路径也有可能因为用户不小心删除图片内容而导致程序图标加载失败。所以Qt中使用的是qrc机制在Qt项目中引入一个额外的xml文件后缀名用.qrc表示在这个xml中要把使用的图片资源导入进去并且在xml中进行记录。Qt在编译项目时就会根据qrc中描述的图片信息找到图片内容并且提取出图片的二进制数据再把这些二进制数据转为C代码最终编译为exe中。如果使用qrc呢1. 在项目中创建一个qrc文件右键单击项目文件选择添加新文件选择Qt下的Qt Resource File点击选择输入你的文件名文件名不能带中文或者特殊符号点击下一步这里一般不用改点击完成2. 将项目中要用到的图片导入到qrc文件中qrc文件创建后我们会看到这个界面1先创建一个前缀Prefix所谓的前缀就是一个Qt抽象出来的虚拟目录因为qrc机制就是把图片的二进制数据转为C代码一个很大的char数组——图片的二进制数据为了方便Qt代码中访问到这个图片Qt就自己抽象出来了一个虚拟目录。我们点击添加前缀将Prefix改为/2将图片通过添加文件导入到资源文件中点击添加文件在点击添加前缀之前是被禁用了的此时这里的出现的目录就是代码所在的目录我们在导入图片的时候要确保导入的图片必须在resource.qrc文件的同级目录或子目录里我直接创建了一个image文件夹存放项目中会用到的图片然后在image目录中选中要添加的图片资源点击打开导入成功后我们会在资源文件中看到导入的图片资源导入到资源文件后我们就可以把绝对路径改为“:Prefix相对路径”的格式了this-setWindowIcon(QIcon(:/image/mountain.png));qrc中导入的图片资源就会被转为qrc_resource.cpp这个C代码。当Qt项目进行编译的时候这个cpp文件就被编译到了exe中当exe程序运行的时候图片的数据也就被加载到内存中了。这种qrc机制可以让图片资源完全融入程序中不用担心资源文件内容被误删的情况但是这个方法的不足之处就是不能在资源文件中存储太大的资源否则会导致程序运行时间过长。6. QWidget的windowOpacity属性windowOpacity属性和控件的不透明数据相关。相关APIfloat windowOpacity(); 获取控件的不透明数值,0.0~1.00.0表示全透明1.0表示完全不透明void setWindowOpacity(float) 设置控件的不透明数值代码示例//widget.cpp #include widget.h #include ui_widget.h #include QDebug #includeQIcon Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui-setupUi(this); } Widget::~Widget() { delete ui; } void Widget::on_pushButton_Up_clicked() { float opacity this-windowOpacity(); if(opacity1.0) return; opacity0.1; this-setWindowOpacity(opacity); } void Widget::on_pushButton_Down_clicked() { float opacity this-windowOpacity(); if(opacity0.0) return; opacity-0.1; this-setWindowOpacity(opacity); }运行结果点击“-”按钮后效果如下图所示点击“”可复原
返回列表