Qt开发经验小技巧146-150
- Qt中自带的很多控件,其实都是由一堆基础控件(QLabel、QPushButton等)组成的,比如日历面板 QCalendarWidget 就是 QToolButton+QSpinBox+QTableView 等组成,妙用 findChildren 可以拿到父类对应的子控件集合,可以直接对封装的控件中的子控件进行样式的设置,其他参数的设置比如设置中文文本(默认可能是英文)等。
//打印子类类名集合
void printObjectChild(const QObject *obj, int spaceCount)
{
qDebug() << QString("%1%2 : %3")
.arg("", spaceCount)
.arg(obj->metaObject()->className())
.arg(obj->objectName());
QObjectList childs = obj->children();
foreach (QObject *child, childs) {
printObjectChild(child, spaceCount + 2);
}
}
//拿到对话框进行设置和美化
QFileDialog *fileDialog = new QFileDialog(this);
fileDialog->setOption(QFileDialog::DontUseNativeDialog, true);
QLabel *lookinLabel = fileDialog->findChild<QLabel*>("lookInLabel");
lookinLabel->setText(QString::fromLocal8Bit("文件目录:"));
lookinLabel->setStyleSheet("color:red;");
//设置日期框默认值为空
QLineEdit *edit = ui->dateEdit->findChild<QLineEdit *>("qt_spinbox_lineedit");
if (!edit->text().isEmpty()) {
edit->clear();
}
- Qt内置了各种对话框,比如文件对话框-QFileDialog ,颜色对话框-QColorDialog ,默认都会采用系统的对话框风格样式,这样可以保持和系统一致,如果不需要的话可以取消该特性,取消以后会采用Qt自身的对话框,这样才能进行美化和其他处理。
QFileDialog *fileDialog = new QFileDialog(this);
//不设置此属性根本查找不到任何子元素,因为默认采用的系统对话框
fileDialog->setOption(QFileDialog::DontUseNativeDialog, true);
qDebug() << fileDialog->findChildren<QLabel *>();
//打印输出 QLabel(0x17e2ff68, name="lookInLabel"), QLabel(0x17e35f88, name="fileNameLabel"), QLabel(0x17e35e68, name="fileTypeLabel")
- QtCreator集成开发环境,也内置了对快速添加注释的支持,比如最常用的在头文件开头添加一大段通用模板的注释,标注文件创建者、时间等信息。
- 菜单->工具->选项->文本编辑器->右侧tab页面片段(snippets);
- 组选择C++, 可以看到这里面已经内置了不少定义比如foreach,可以依葫芦画瓢;
- 添加一个片段, 比如名字是fun, 触发种类是这个片段的简单描述;
- 当我们在代码文件中键入fun时, 会自动弹出智能提醒, 选择我们的代码片段回车, 自动填充代码;
- 按tab可以在变量间切换, 输入完成后回车, 完成编辑;
/**
* @brief $name$
* @param $param$
* @author feiyangqingyun
* @date $date$
*/
$ret$ $name$($param$)
{
$$
}
- Qt5时代对信号槽运行机制据说有了很大的改进。
- 在Qt5之前,connect一般都只能这么写connect(sender, SIGNAL(signalFunc()), receiver, SLOT(receiveFunc())),就是说在connect的时候,必须把信号用宏SIGNAL包裹起来,把槽函数用宏SLOT包裹起来,这样才能被Qt的Moc机制识别;
- 在编译的时候即使信号或槽不存在或者参数不正确也不会报错,但是在执行的时候无效,会打印提示,对于C++这种静态语言来说,这是不友好的,不利于调试;
- 但是Qt5之后更加推荐"取地址的写法",采用这种写法,如果编译的时候信号或槽不存在是无法编译通过的,相当于编译时检查,不容易出错;
- 如果没有历史遗留问题需要兼容Qt4还是推荐用新写法,有类型检查更严格,而且支持的写法多样非常灵活;
- 一些简单的处理逻辑强烈推荐直接lambda表达式直接处理完;
class MainWindow : public QMainWindow
{
Q_OBJECT
public: MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
private:
void test_fun();
private slots:
void test_slot();
};
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//早期写法,通用Qt所有版本,只支持定义了slots关键字的函数
//connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(test_fun()));
connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(test_slot()));
//新写法,支持Qt5及后期所有版本,支持所有函数,无需定义slots关键字也行
connect(ui->pushButton, &QPushButton::clicked, this, &MainWindow::test_fun);
connect(ui->pushButton, &QPushButton::clicked, this, &MainWindow::test_slot);
//另类写法,支持lambda表达式,直接执行代码
connect(ui->pushButton, &QPushButton::clicked, [this] {test_fun();});
connect(ui->pushButton, &QPushButton::clicked, [this] {
qDebug() << "hello lambda";
});
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::test_fun()
{
qDebug() << "test_fun";
}
void MainWindow::test_slot()
{
qDebug() << "test_slot";
}
- Qt样式表有多种运行机制,主要是考虑到各种需求场景,继承自QWidget的类和qApp类都支持setStyleSheet方法,还可以统一将样式表放在文件,或者将样式文件加入到资源文件。
- 斗气:qss内容写得到处都是,哪里需要就写在哪里,各种控件调用 setStyleSheet方法传入样式表内容,或者直接对应控件鼠标右键弹出菜单选择改变样式表填入内容;
- 斗者:qss内容放在文件,读取文件内容设置样式表,程序发布的时候带上qss文件;
- 斗师:qss文件作为资源文件放到qrc文件,直接编译到可执行文件中,防止篡改;
- 斗灵:在qss文件中自定义一些标志充当变量使用,读取以后替换对应的变量为颜色值,类似动态换肤;
- 斗王:放在文件容易被篡改,集成到可执行文件不够灵活,一旦样式表更新需要重新编译文件,如何做到既能只更新样式表文件,又不需要重新编译可执行文件,又能防止被篡改,采用rcc命令将资源文件编译生成二进制,只需要替换该二进制文件即可;
- 斗皇:继承qstyle类自己实现完成所有样式接口,统一整体风格,大名鼎鼎的UOS系统默认规则就是如此,不允许用样式表,全部painter绘制;
Qt开发经验开源主页(持续更新):
Qt开发经验小技巧146-150的更多相关文章
- Qt开发经验小技巧81-90
Qt中的QColor对颜色封装的很完美,支持各种转换,比如rgb.hsb.cmy.hsl,对应的是toRgb.toHsv.toCmyk.toHsl,还支持透明度设置,颜色值还能转成16进制格式显示. ...
- Qt开发经验小技巧61-70
很多人问Qt嵌入式平台用哪个好,这里统一回答(当前时间节点2018年):imx6+335x比较稳定,性能高就用RK3288 RK3399,便宜的话就用全志H3,玩一玩可以用树莓派香橙派. 对于大段的注 ...
- Qt开发经验小技巧41-50
如果使用sqlite数据库不想产生数据库文件,可以创建内存数据库. QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); ...
- Qt开发经验小技巧71-80
在我们使用QList.QStringList.QByteArray等链表或者数组的过程中,如果只需要取值,而不是赋值,强烈建议使用 at() 取值而不是 [] 操作符,在官方书籍<C++ GUI ...
- Qt开发经验小技巧51-60
在某些http post数据的时候,如果采用的是&字符串连接的数据发送,中文解析乱码的话,需要将中文进行URL转码. QString content = "测试中文"; Q ...
- Qt开发经验小技巧31-40
代码判断MSVC编译器版本. if (_MSC_VER == 1800) MSVC++ 14.0 _MSC_VER == 1900 (Visual Studio 2015) MSVC++ 12.0 _ ...
- Qt开发经验小技巧21-30
如果出现Z-order assignment: is not a valid widget.错误提示,用记事本打开对应的ui文件,找到为空的地方,删除即可. 善于利用QComboBox的addItem ...
- Qt开发经验小技巧11-20
获取类的属性 const QMetaObject *metaobject = object->metaObject(); int count = metaobject->propertyC ...
- Qt开发经验小技巧1-10
当编译发现大量错误的时候,从第一个看起,一个一个的解决,不要急着去看下一个错误,往往后面的错误都是由于前面的错误引起的,第一个解决后很可能都解决了. 定时器是个好东西,学会好使用它,有时候用QTime ...
- Qt开发经验小技巧合集
一.开发经验总结 当编译发现大量错误的时候,从第一个看起,一个一个的解决,不要急着去看下一个错误,往往后面的错误都是由于前面的错误引起的,第一个解决后很可能都解决了. 定时器是个好东西,学会好使用它, ...
随机推荐
- 让查询可以使用 json path
记录一下最近sv.db的完善 1. 让查询可以使用 json path 有时候我们会存储 json 到 db,也有时会只取json部分数据,或者通过json部分数据进行过滤 所以sv.db 也支持这些 ...
- Js数组&高阶函数
数组也是一种复合数据类型,在数组可以存储多个不同类型的数据 数组中存储的是有序的数据,数组中的每个数据都有一个唯一的索引可以通过索引来操作获取数据 数组中存储的数据叫做元素 任何类型的值都可以成为数组 ...
- python reqeusts 请求时headers指定content length后 请求不响应
解释: HTTP头部中的Content-Length字段表示请求体的大小,用字节来表示.当你在使用Python的requests库进行请求时,如果你手动设置了Content-Length,但实际发送的 ...
- 什么DevOps方法论?
最近项目组事情越来越多,人员管理和项目事项管理成为了重点关注的问题,无意间听到同事间讨论DevOps方法论可以有效提升项目管理能力,实现组织精益化管理,运维一体化.于是我上网查了一下"Dev ...
- Lua代码——使用遗传进化算法(neat算法)玩超级玛丽游戏
前文: 模拟器运行环境及Lua代码--使用遗传进化算法(neat算法)玩超级玛丽游戏 lua语言实现的neat算法代码: -- MarI/O by SethBling -- Feel free to ...
- 鸿蒙NEXT自定义组件:太极Loading
[引言](完整代码在最后面) 本文将介绍如何在鸿蒙NEXT中创建一个自定义的"太极Loading"组件,为你的应用增添独特的视觉效果. [环境准备] 电脑系统:windows 10 ...
- Eclipse JDT--AST入门
最近做program analysis,需要解析Java的源代码,于是就去看了看Abstract Syntax Tree(AST,中文为抽象语法树).有点无奈的是,网上关于这方面的资料比我想象中的少, ...
- Python:编程“八荣八耻”之我见
刚在逛CPyUG时看到了个主题讨论python的八荣八耻,见:http://bit.ly/4jeBor, 主题内容如下: 以动手实践为荣,以只看不练为耻. 以打印日志为荣,以单步跟踪为耻. 以空白 ...
- PHP模块之ssh2
php远程copy文件以及在远程服务器中执行命令时,所用到的模块是ssh2,以后所有的操作都依据ssh2连接句柄完成. libssh: https://www.libssh2.org/ ssh2: h ...
- Tornado框架之项目部署(六)
知识点 supervisor配置与使用 nginx配置 目录: 部署Tornado 1. supervisor 安装 配置 启动 supervisorctl 2. nginx 部署Tornado 为了 ...