移除旧的样式
//移除原有样式
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)接口即可。