Qt总结

Qt总结

常见类使用
常见类使用 # QTableWidget # 关于QTableWidget等控件调用自带的removeRow、clearContents、clear函数删除了里面的item和内容,会自动调用item或者cellwidget的析构函数进行资源释放,不用自己手动再去释放。 //每次调用 clearContents 都会自动清理之前的item ui->tableWidget->clearContents(); for (int i = 0; i < count; ++i) { ui->tableWidget->setItem(i, 0, new QTableWidgetItem("aaa")); ui->tableWidget->setItem(i, 1, new QTableWidgetItem("bbb")); ui->tableWidget->setCellWidget(i, 2, new QPushButton("ccc")); } QTabWidget选项卡控件,生成的tabbar选项卡宽度是按照文本自动设置的,文本越长选项卡的宽度越大,很多时候,我们需要的是一样的宽度或者等分填充, //方法1:字符串空格填充 ui->tabWidget->addTab(httpClient1, "测 试"); ui->tabWidget->addTab(httpClient1, "人员管理"); ui->tabWidget->addTab(httpClient1, "系统设置"); //方法2:识别尺寸改变事件自动设置最小宽度 void MainWindow::resizeEvent(QResizeEvent *e) { int count = ui->tabWidget->tabBar()->count(); int width = this->width() - 30; QString qss = QString("QTabBar::tab{min-width:%1px;}").arg(width / count); this->setStyleSheet(qss); } //方法3:设置全局样式,不同选项卡个数的设置不同的宽度 QStringList list; list << QString("QTabWidget[tabCount=\"2\"]>QTabBar::tab{min-width:%1px;}").
snippet
延时异步加载 # 用QTimer::singleShot单次定时器和QMetaObject::invokeMethod可以解决意想不到的问题。比如在窗体初始化的时候加载一个耗时的操作,很容易卡主界面的显示,要在加载完以后才会显示界面,这就导致了体验很卡不友好的感觉,此时你可以将耗时的加载(有时候这些加载又必须在主线程,比如用QStackWidget堆栈窗体加载一些子窗体),延时或者异步进行加载,这样就会在界面显示后去执行,而不是卡住主界面。 //异步执行load函数 QMetaObject::invokeMethod(this, "load", Qt::QueuedConnection); //延时10毫秒执行load函数 QTimer::singleShot(10, this, SLOT(load())); 获取类的属性和方法 # //拿到控件元对象 const QMetaObject *metaObject = widget->metaObject(); //所有属性的数量 int propertyCount = metaObject->propertyCount(); //propertyOffset是自定义的属性开始的位置 int propertyOffset = metaObject->propertyOffset(); //循环取出控件的自定义属性, int i = 0 表示所有属性 for (int i = propertyOffset; i < propertyCount; ++i) { QMetaProperty metaProperty = metaObject->property(i); const char *name = metaProperty.name(); const char *type = metaProperty.typeName(); QVariant value = widget->property(name); qDebug() << name << type << value; } //所有方法的数量 int methodCount = metaObject->methodCount(); //methodOffset是自定义的方法开始的位置 int methodOffset = metaObject->methodOffset(); //循环取出控件的自定义方法, int i = 0 表示所有方法 for (int i = methodOffset; i < methodCount; ++i) { QMetaMethod metaMethod = metaObject->method(i); const char *name = metaMethod.
QSS样式
QSS样式 # 直接调用控件的 setstylesheet, 结果是每个控件 style 返回的对象都是不同的(地址不同足以证明是不同的对象), 而只给 QApplication 对象 setStyleSheet, 每个控件的 style 函数返回的对象都是相同的. 基于以上原因, 在开发时, 无论是出于维护的便捷性, 还是节省内存资源的考虑, 都应该有 一个 qss 文件来存放所有的样式表, 而不应该将 setStyleSheet 写的到处都是. 默认程序中获取焦点以后会有虚边框,如果看着觉得碍眼不舒服可以去掉,设置样式即可:setStyleSheet("*{outline:0px;}"); outline (轮廓)是控件有焦点时, 绘制在边框边缘的外围,可起到突出作用,轮廓线不占据控 件, 也不一定是矩形 outline: none; width, height 两个属性, 设置的均是盒子的内容的宽高, 而我们在 c++ 代码中的窗口的 width 与 height 指的是整个盒子的宽度与高度, 指示器设置样式 # 可以对整体的指示器设置样式,而不需要单独对每个控件的指示器设置, *::down-arrow{} *::menu-indicator{} *::up-arrow:disabled{} *::up-arrow:off{} QPushButton左对齐文字 # QPushButton左对齐文字,需要设置样式表 QPushButton{text-align:left;} 三种设置文本的方法 # QLabel有三种设置文本的方法,掌握好Qt的属性系统,举一反三,可以做出很多效果。 //常规办法 ui->label->setText("hello"); //取巧办法 ui->label->setProperty("text", "hello"); //属性大法 ui->label->setStyleSheet("qproperty-text:hello;"); 样式表不起作用 # Qt中继承QWidget之后,样式表不起作用,解决办法有三个。强烈推荐方法一。 方法一:设置属性 this->setAttribute(Qt::WA_StyledBackground, true); 方法二:改成继承QFrame,因为QFrame自带paintEvent函数已做了实现,在使用样式表时会进行解析和绘制。 方法三:重新实现QWidget的paintEvent函数时,使用QStylePainter绘制。 void Widget::paintEvent(QPaintEvent *) { QStyleOption option; option.