QT-常用控件(一)
目录
QWIDGET-enable属性
QWIDGET-geometry属性(几何)
window frame的影响
QWIDGET-windowtitle属性
QWIDGET-windowlcon属性(图标)
QWIDGET-enable属性
表示一个控件是否处于可用状态,相对概念为禁用,所谓"禁用"指的是该控件不能接收任何用户的输入事件,并且外观上往往是灰色的,如果一个 widget 被禁用,则该 widget 的子元素也被禁用。
禁用效果:
QWIDGET-geometry属性(几何)
粗浅的理解为(x,y,width,height)四个属性的统称;
Qt 中针对一些几何上的概念也进行了封装。
QPoint 表示一个点,QRect 表示一个矩形,他们都属于是小对象, 里面的属性非常少,占用空间也小.C++中使用上述对象, 通常就会按照值的方式来传递参数了。
样例:我们期望点击对应的按钮来修改target对应的geometry。
控件函数操作操作:
当前代码实际执行的效果,是在调整左上角位置,左上角位置改变的同时,高度和宽度也同时发生了改变。
平移效果代码:
window frame的影响
Qt 中存在多种用于处理窗口位置和尺寸的 API,且不同 API 基于的坐标系原点有所不同,同时在特定阶段调用这些 API 会有特殊表现:
- 从坐标系和 API 本身来看,
geometry()
与setGeometry()
以 Widget 本体左上角为原点,不考虑窗口框架(Window frame);frameGeometry()
和setFrameGeometry()
以窗口框架左上角为原点,会考虑窗口框架。 -
Widget::Widget(Qwidget*parent):OWidget(parent),ui(new Ui::widget) {ui->setupui(this);QRect rect1=this->geometry();ORect rect2=this->frameGeometry();qDebug()<< rect1;qDebug()<< rect2;}
- 从代码运行阶段的情况来看,若在
Widget
类的构造函数中(此时Widget
对象正在构造,还未被加入到窗口框架),直接针对Widget
对象使用geometry
和frameGeometry
并通过qDebug()
输出结果,能观察到二者返回的位置尺寸信息存在区别。 - 进行链接并运行后,结果如下图所示:
QWIDGET-windowtitle属性
需要注意,下图使用方法并不正确。
关键问题:QPushButton
调用 setWindowTitle
无意义
setWindowTitle
是用于设置 ** 窗口(QWidget
及其顶层子类,如 QMainWindow
、QDialog
等)** 的标题,显示在窗口的标题栏上。
而 QPushButton
是 “按钮部件”,不是独立的窗口(它是依附于父窗口存在的子部件),调用 button->setWindowTitle("通过按钮设置窗口标题")
不会有任何效果 —— 按钮没有自己的 “标题栏” 来显示这个标题。
正确的逻辑(如果要通过按钮修改窗口标题)
应该在按钮的点击信号槽中,修改父窗口(或目标窗口)的标题。示例如下:
// 假设当前类是 QWidget 子类(如 MainWindow)
this->setWindowTitle("这是窗口标题");QPushButton* button = new QPushButton("按钮", this);
// 连接按钮的点击信号到自定义槽函数
connect(button, &QPushButton::clicked, this, [this]() {// 点击按钮时,修改“当前窗口”的标题this->setWindowTitle("通过按钮设置窗口标题");
});
这样,点击按钮时,整个窗口的标题栏才会更新为 “通过按钮设置窗口标题”。
总结
setWindowTitle
只对 “窗口级部件” 有效,子部件(如按钮、标签等)调用它不会生效。- 若要通过子部件(如按钮)修改窗口标题,需在子部件的交互逻辑中,操作目标窗口的
setWindowTitle
。
QWIDGET-windowlcon属性(图标)
Qt 把各种涉及到的相关概念,都封装成了 类,Qlcon 就表示一个图标,Qlcon 更推荐创建在栈上。
// 写法一:使用双反斜杠QIcon icon("C:\\icons\\example.ico"); // 写法二:使用正斜杠// QIcon icon("C:/icons/example.ico");
假设图标文件 icon.png
和程序可执行文件在同一目录,直接写文件名即可:
QIcon icon("icon.png");