Qt技巧(三)编辑框嵌入按钮,系统位数判断,判断某对象是否属于某种类,控件取句柄,支持4K,巧用QEventLoop,QWidget的窗体样式

继续讲一些Qt技巧操作

1.编辑框中放个按钮

我们将测需要在QLineEdit中放一个按钮,比如密码输入框放置可见/不可见的按钮;比如搜索框放置搜索按钮;

实现方式1:以将控件A添加到布局,然后控件B设置该布局,这种灵活性提高了控件的组合度

cpp 复制代码
QPushButton *btn = new QPushButton;
btn->resize(30, ui->lineEdit->height());
QHBoxLayout *layout = new QHBoxLayout(ui->lineEdit);
layout->setMargin(0);
layout->addStretch();
layout->addWidget(btn);

实现方式2:组合假象,在一个QWidget中水平放置一个QLineEdit和一个QPushbutton,将widget样式做成编辑框的样式,同坐几个部件的位置组合和样式设计,模拟出一个带按钮的编辑框;

2.根据操作系统位数判断加载

有时候我们需要兼容不同的操作系统,特别是一些依赖库的使用时,要根据不同位的系统加载对应的库,这就需要根据操作系统位数判断加载。

cpp 复制代码
win32 {
contains(DEFINES, WIN64) {
DESTDIR = $$PWD/../bin64
} else {
DESTDIR = $$PWD/../bin32
}
}

3.使用QObject::inherits()判断某对象是否属于某种类。

有时候由于接口封装,你并不知道某个对象实际是哪个类的,但只要他是QObject继承下来的的,就可以使用QObject::inherits()来判断他是否你猜想的类

cpp 复制代码
QTimer *timer = new QTimer; // QTimer inherits QObject
timer->inherits("QTimer"); // returns true
timer->inherits("QObject"); // returns true
timer->inherits("QAbstractButton"); // returns false

4.控件取句柄。

MFC中是一个控件就有一个句柄,而Qt中其实默认是一个窗体一个句柄,但在有些Qt调用MFC或其他外部库的时候,需要确保每个控件有自己的句柄,这就需要在main函数中做特定的设置。

cpp 复制代码
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//App程序设置属性,是任何部件都被视为窗体
a.setAttribute(Qt::AA_NativeWindows);
}

5.支持4K高分辨率的设置

如果你要支持4K屏的高分辨率,需要在main函数中加上判断

cpp 复制代码
int main(int argc, char *argv[])
{

#if (QT_VERSION >= QT_VERSION_CHECK(5,6,0))
QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif
QApplication a(argc, argv);
}

6.巧用QEventLoop

巧妙的用QEventLoop开启事件循环,可以使得很多同步获取返回结果而不阻塞界面。

查看源码得知,其实QEventLoop内部新建了线程执行,也就是你不用自己开线程,就可以多线程的去并行执行某些任务。

cpp 复制代码
QEventLoop loop;
connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
loop.exec();

7.QWidget的窗体样式表不起作用的解决办法

Qt中继承自QWidget的窗体,由于其提供的基本属性比较少,只支持"background、background-clip和background-origin属性",那么如果你的样式表有"QWidget#testWidget{border:1px solid gray;}",就不会生效,解决办法有三种:

方法一:设置属性 this->setAttribute(Qt::WA_StyledBackground, true);

方法二:改成继承QFrame,因为QFrame继承自QWidget,QFrame是基本控件的基类,并且带有框架属性。继承关系如下:QPushButton,QLabel... -> QFrame -> QWidget。Frame自带paintEvent函数已做了实现,在使用样式表时会进行解析和绘制。

方法三:自己代码重新实现QWidget的paintEvent函数,使用QStylePainter绘制,代码如下:

cpp 复制代码
void Widget::paintEvent(QPaintEvent *)
{
QStyleOption option;
option.initFrom(this);
QPainter painter(this);
style()->drawPrimitive(QStyle::PE_Widget, &option, &painter, this);
}
相关推荐
小师兄吃牛肉1 分钟前
C语言篇:内联函数
c语言·开发语言
yuniko-n18 分钟前
【Java】字符串相关坑点
java·开发语言·python
jimy11 小时前
虚函数vtable,链接时看到构造函数,linker把符号地址写入vtable(三)
开发语言·c++
ss2731 小时前
AI全栈实战 | 3.3-02 Python 并发:有 GIL 为什么还用多线程,asyncio 和 JS 事件循环同源不同味
开发语言·javascript·python
菜鸟~noob2331 小时前
【电子战】第20篇:凸优化与对数障碍法【含matlab代码】
开发语言·matlab
Wang's Blog1 小时前
Java框架 SpringCloud 快速入门: 服务拆分案例 Demo
java·开发语言·spring cloud
小小龙学IT1 小时前
Python SQLAlchemy 2.0 深度解析:从 Core 到 ORM 的数据访问双引擎
开发语言·数据库·python
2601_962885721 小时前
如何用 Python 计算 ROC 变动率指标做动量分析?
开发语言·python·算法
潼心1412o2 小时前
C++初阶(长期更新)第9讲:string(上)
开发语言·c++
朝朝辞暮i2 小时前
C++ 第 39 章: 阶段性总复习——类、对象、构造、继承、this、指针与智能指针
开发语言·c++·算法·ros2