Qt小技巧

移除旧的样式

//移除原有样式
style()->unpolish(ui->btn);
//重新设置新的该控件的样式。
style()->polish(ui->btn);

 

获取类的属性

const QMetaObject *metaobject = object->metaObject();
int count = metaobject->propertyCount();
for (int i = 0; i < count; ++i) {
    QMetaProperty metaproperty = metaobject->property(i);
    const char *name = metaproperty.name();
    QVariant value = object->property(name);
    qDebug() << name << value;
}

Qt内置图标封装在QStyle中,大概七十多个图标,可以直接拿来用。 QStyle::SP_TitleBarMenuButton

 

可以将控件A添加到布局,然后控件B设置该布局,这种灵活性大大提高了控件的组合度,比如可以在文本框左侧右侧增加一个搜索按钮,按钮设置图标即可

	QLineEdit* pLineEdit = new QLineEdit(this);

	QPushButton *btn = new QPushButton;
	btn->resize(30, pLineEdit->height());

	QHBoxLayout *layout = new QHBoxLayout(pLineEdit);
	layout->setMargin(0);
	layout->addStretch();
	layout->addWidget(btn);

 

巧妙的使用findChildren可以查找该控件下的所有子控件。findChild为查找单个

//查找指定类名objectName的控件
QList<QWidget *> widgets = parentWidget.findChildren<QWidget *>("widgetname");
//查找所有QPushButton
QList<QPushButton *> allPButtons = parentWidget.findChildren<QPushButton *>();
//查找一级子控件,不然会一直遍历所有子控件
QList<QPushButton *> childButtons = parentWidget.findChildren<QPushButton *>(QString(), Qt::FindDirectChildrenOnly);

 

巧妙的使用inherits判断是否属于某种类

QTimer *timer = new QTimer;         // QTimer inherits QObject
timer->inherits("QTimer");          // returns true
timer->inherits("QObject");         // returns true
timer->inherits("QAbstractButton"); // returns false

使用弱属性机制,可以存储临时的值用于传递判断。可以通过widget->dynamicPropertyNames()列出所有弱属性名称,然后通过widget->property("name")取出对应的弱属性的值

 

在开发时, 无论是出于维护的便捷性, 还是节省内存资源的考虑, 都应该有一个 qss 文件来存放所有的样式表, 而不应该将 setStyleSheet 写的到处都是。如果是初学阶段或者测试阶段可以直接UI上右键设置样式表,正式项目还是建议统一到一个qss样式表文件比较好,统一管理

 

QLabel有三种设置文本的方法,掌握好Qt的属性系统,举一反三,可以做出很多效果

ui->label->setStyleSheet("qproperty-text:hello;");
ui->label->setProperty("text", "hello");
ui->label->setText("hello");

 

安全的删除Qt的对象类,强烈建议使用deleteLater而不是delete,因为deleteLater会选择在合适的时机进行释放,而delete会立即释放,很可能会出错崩溃。如果要批量删除对象集合,可以用qDeleteAll,比如 qDeleteAll(btns);

 

在QTableView控件中,如果需要自定义的列按钮、复选框、下拉框等其他模式显示,可以采用自定义委托QItemDelegate来实现,如果需要禁用某列,则在自定义委托的重载createEditor函数返回0即可。自定义委托对应的控件在进入编辑状态的时候出现,如果想一直出现,则需要重载paint函数用drawPrimitive或者drawControl来绘制。

 

很多时候需要在已知背景色的情况下,能够清晰的绘制文字,这个时候需要计算对应的文字颜色

//根据背景色自动计算合适的前景色
double gray = (0.299 * color.red() + 0.587 * color.green() + 0.114 * color.blue()) / 255;
QColor textColor = gray > 0.5 ? Qt::black : Qt::white;

 

使程序居中显示

//主窗口    
HttpWindow httpWin;
//获取窗口在屏幕的有效区域  分辨率-任务栏
const QRect availableSize = QApplication::desktop()->availableGeometry(&httpWin);
//屏幕大小的5/1
httpWin.resize(availableSize.width() / 5, availableSize.height() / 5);
//居中显示
httpWin.move((availableSize.width() - httpWin.width()) / 2, (availableSize.height() - httpWin.height()) / 2);

 

使用QUuid生成唯一码

#include <QDebug>
#include <QUuid>

int main(int argc, char *argv[])
{
    qDebug()<<QUuid::createUuid().toString();

    return 0;
}

 

为Qt程序添加启动图片

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QPixmap pixmap(":/splash.png"); // 装载图片
    QSplashScreen splash(pixmap); // 初始化图片到QSplashScreen
    splash.show(); // 显示图片
    app.processEvents(); // 刷新事件循环
    ...
    QMainWindow window;
    window.show();
    splash.finish(&window); // 完成后自动close
    return app.exec();
}


//在加载过程中可以调用splash->showMessage("Message");来显示文字;
//如果想绘制图形通过设置pixmap的指针或重写void QSplashScreen::drawContents(QPainter *painter)接口即可。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值