1. QT样式表——url路径
- 绝对路径
setStyleSheet(“background:url(c:/xxx/theme/img.jpg)”);
- 相对路径
setStyleSheet(“background:url(/theme/img.jpg)”);或setStyleSheet(“background:url(./theme/img.jpg)”);
- 从QRC中加载
setStyleSheet(“background:url(:/theme/img.jpg)”);
可手动编辑xx.qrc文件或通过vs操作。
2.图片样式
图片的几种样式:“居中”、“平铺”、“缩放”、“拉伸”
以下来自https://blog.csdn.net/bochen_cwx/article/details/82083570
-
使用setStyleSheet
背景颜色和背景图片可以同时设置(background-color、background-image),存在以下行为:图片路径无法正确解析时,只显示背景颜色;图片可以解析时,按设置方式显示图片,而在图片范围外显示背景颜色。默认的图片显示位置为左上角,填充方式是平铺。这两个可以通过background-position、background-repeat来调整。 存在问题:这种方式设置的图片都是按原图大小进行显示,不能进行缩放。而且url只能填入路径,不能是一个QPixmap,所以也无法通过调整图片大小来缩放显示。所以只能实现“居中”、”平铺”两种形式,而无法实现“缩放”、“拉伸” 一种替代方式是使用border-image属性,这种方法显示的图片就是图片调整到widget大小再显示,实现”拉伸”形式。同样无法实现缩放。这种方法不够灵活。
-
使用画板QPalette
这种方式是通过给QPalette设置QBrush画刷来设置背景的,最有用的地方在于它可以设置QPixmap,使得背景图片可以按照我们想要的大小进行变化,可以轻松实现”拉伸”方式。 存在问题:这种方法会以平铺的方式填充满整个widget,即使你把图片scale到自己想到的大小,剩余的地方也会被填充。所以这种方式只能实现“平铺”、“拉伸”,而无法实现“居中”、“缩放”。
-
重写paintEvent方法
这种方法是最灵活的,可以按照自己想要的任何方式描绘背景。可以实现“居中”、“平铺”、“缩放”、“拉伸”。 存在问题:因为背景如何显示全部要自己手动实现,需要精确的坐标计算图片的显示位置。特别是“平铺”方式,需要根据widget大小和图片的大小先判断出要重复画多少次图,还要计算每一次图的起点。
-
QLabel加背景
可以直接设置QPixmap的,就可以比较简单地实现常用的背景图片四种显示方式。而对于不能设置QPixmap的widget,在允许的情况下可以重载该widget,并在该widget内创建一个与widget同样大小的QLabel,专门用来显示背景。项目中,因为要调整的widget是自己实现的,所以最终采用了在内部创建一个QLabel专门处理背景显示问题。
相关的设置代码如下:
QLabel label = new QLabel(this);
label.setGeometry(0, 0, this->width(), this->height());QPixmap bgImage(“1.jpg”);
if (bgImage.isNull())
{
label->setStyleSheet(“background-color:black”);
}
else
{
switch (方式)
{
case 居中:
label->setStyleSheet(“background-color:black;background-image:url(1.jpg);background-position:center;background-repeat:no-repeat;”);
break;case 缩放: label->setStyleSheet("background-color:black"); label->setAlignment(Qt::AlignCenter); label->setPixmap(bgImage.scaled(this->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation)); break; case 拉伸: label->setStyleSheet("background-color:black"); label->setPixmap(bgImage.scaled(this->size(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation)); break; case 平铺: label->setStyleSheet("background-color:black;background-image:url(1.jpg);background-position:top left;background-repeat:repeat-xy;"); break; }
}
3.Qt 窗口操作函数(置顶、全屏,最大化最小化按钮设置等)
模式对话框
阻塞同一应用程序中其它可视窗口输入的对话框。模式对话框有自己的事件循环,用户必须完成这个对话框中的交互操作,并且关闭了它之后才能访问应用程序中的其它任何窗口。模式对话框仅阻止访问与对话相关联的窗口,允许用户继续使用其它窗口中的应用程序。
显示模态对话框最常见的方法是调用其exec()函数,当用户关闭对话框,exec()将提供一个有用的返回值,并且这时流程控制继续从调用exec()的地方进行。通常情况下,要获得对话框关闭并返回相应的值,我们连接默认按钮,例如:”确定”按钮连接到accept()槽,”取消”按钮连接到reject()槽。另外我们也可以连接done()槽,传递给它Accepted或Rejected。
非模式对话框
和同一个程序中其它窗口操作无关的对话框。在文字处理中的查找和替换对话框通常是非模式的,允许用户同时与应用程序的主窗口和对话框进行交互。调用show()来显示非模式对话框,并立即将控制返回给调用者。
如果隐藏对话框后调用show()函数,对话框将显示在其原始位置,这是因为窗口管理器决定的窗户位置没有明确由程序员指定,为了保持被用户移动的对话框位置,在closeEvent()中进行处理,然后在显示之前,将对话框移动到该位置。
半模式对话框
调用setModal(true)或者setWindowModality(),然后show()。有别于exec(),show() 立即返回给控制调用者。
对于进度对话框来说,调用setModal(true)是非常有用的,用户必须拥有与其交互的能力,例如:取消长时间运行的操作。如果使用show()和setModal(true)共同执行一个长时间操作,则必须定期在执行过程中调用QApplication::processEvents(),以使用户能够与对话框交互(可以参考QProgressDialog)。
参见Qt 窗口操作函数(置顶、全屏,最大化最小化按钮设置等)
4. CSS 框模型 BOX MODEL
CSS 框模型
所有 HTML 元素都可以视为方框。在 CSS 中,在谈论设计和布局时,会使用术语“盒模型”或“框模型”。
CSS 框模型实质上是一个包围每个 HTML 元素的框。它包括:外边距、边框、内边距以及实际的内容。下图展示了框模型:
CSS 框模型
对不同部分的说明:
- 内容 - 框的内容,其中显示文本和图像。
- 内边距 - 清除内容周围的区域。内边距是透明的。
- 边框 - 围绕内边距和内容的边框。
- 外边距 - 清除边界外的区域。外边距是透明的。
5. 典型样式设置
QComboBox设置下拉列表样式:
下拉列表中右侧的滚动条样式想要起作用,需要默认滚动条的样式也要修改才可。
样式参见:https://www.cnblogs.com/tingtaishou/p/12155574.html
QProgressBar
设置QSS后,文字跑到里面去了,最好自己实现一个。思路用一个 进度条没有文字 + 一个QLabel.
QGroupBox
QGroupBox {
background-color: #151b27;
border: 1px solid gray;
border-radius: 5px;
margin-top: 5px; /* leave space at the top for the title */
}
QGroupBox::title {
color: #C8E1EB;
subcontrol-origin: padding;
left: 16px;
top:-8px;/*靠上一点*/
}
分割线设置
QFrame{
border: none;
border-radius: 2px;
background-color: #151b27;
}
/*水平分割线*/
QFrame[frameShape="4"]{
background-color: #214A65;
max-height: 1px;
}
/*竖直分割线*/
QFrame[frameShape="5"]{
background-color: #214A65;
max-width: 1px;
}
QT去除控件被选中后的焦点虚线框
QWidget:focus{outline: none;} /remove all QWidget’s focus border/
树的表头设置
ui->treeWidget->headerItem()->setTextAlignment(0, Qt::AlignHCenter | Qt::AlignVCenter); //居中
ui->treeWidget->headerItem()->setTextAlignment(1, Qt::AlignHCenter | Qt::AlignVCenter); //居中
/*单独设置树的表头*/
QTreeView QHeaderView::section {
font-size: 14px;
color: #EBF2F6;
min-width: 80px;
min-height: 34px;
/*border: 1px solid #1F374E;*/
background-color: #1F374E;
border-radius: 1px;
}
透明效果
-
//不显示标题栏,亦无边框
setWindowFlags(windowFlags() | Qt::FramelessWindowHint);
setAttribute(Qt::WA_TranslucentBackground, true); -
//setWindowOpacity(0.5);
-
// QPalette pal = palette();
// pal.setColor(QPalette::Background, QColor(0x01, 0x01, 0x01, 128));
// setPalette(pal);
6.其它
Qt中定时器的使用
Qt中定时器的使用有两种方法,一种是使用QObject类提供的定时器startTimer,还有一种就是使用QTimer类。
//.h文件
class Demo: public QObject
{
public:
Demo();
protect slots:
void timerEvent(QTimerEvent *event) Q_DECL_OVERRIDE;
private:
int timerId; //用于区分不同的计时器,示例举了2个计时器的情况
int timerId2;
}
//.cpp文件
构造函数:
Demo::Demo()
{
timerId = startTimer(200);
timerId2 = startTimer(1000);
}
//timerEvent()函数内
void Demo::timerEvent(QTimerEvent *event)
{
if (event->timerId() == timerId)
{
...
}
else if (event->timerId() == timerId2)
{
...
}
}
获取顶层窗口、获取当前子窗口
foreach(QWidget *win, qApp->topLevelWidgets())
{
//获取顶层窗口
if (MainWindow *mainWin = qobject_cast<MainWindow *>(win))
{
QSize s = mainWin->size();
resize(mainWin->size());
move(mainWin->pos());
break;
}
}
//获取当前子窗口
QMdiSubWindow *sub=ui->mdiArea->activeSubWindow();
QWidget *subwin=sub->widget();//这段容易出错,必须调用widget()
SubText *subWindow=(SubText*)subwin;
if(subWindow==NULL)
{
return;
}
subWindow->print();
图片在QLabel中缩放
QPixmap pixmap("d:/test.jpg");
int with = ui->labPic->width();
int height = ui->labPic->height();
QPixmap fitpixmap = pixmap.scaled(with, height, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); // 饱满填充
//QPixmap fitpixmap = pixmap.scaled(with, height, Qt::KeepAspectRatio, Qt::SmoothTransformation); // 按比例缩放
ui->labPic->setPixmap(fitpixmap);
QT子窗口设置父窗口后的不显示的问题
有时候需要在widget中重新setParent,但会发现setParent有时候会出现问题,比如子窗口不在刷出来等等。
其实,有一点是需要注意的,就是Qt文档里说的,如果你当前widget重新设置了parent之后,默认是invisible的。其实这个说话有点问题,因为有两种情况。
第一种情况就是在父窗口还没show之前,你setParent了一把,这个时候你会发现当调用父窗口的show的时候,子窗口还是会出来。
第二种才是Qt文档想表达的,只有在父窗口已经show的时候,你再setParent给父窗口,这个时候才真正需要显示的show一把。
文件编码格式
QT5 项目中,中文错误有两种方法:
- 就是用utf-8编码 在 .cpp 中 最上端添加以上代码,设置程序的编码格式
#pragma execution_character_set(“utf-8”)
- 使用宏,相当于编码转换了一下,还是用原来的编码格式
QString str = QStringLiteral(“我是中文!”)
QT与VS环境 代码文件编码格式使用utf-8与带bom的utf-8的差异
在.pro文件夹中,新建文件 “charsetsetting.inc”
#pragma execution_character_set("utf-8")
然后再.pro文件中添加:
win32::QMAKE_CXXFLAGS += -FIcharsetsetting.inc
pro文件
变量使用$$
环境变量使用$$()
qmake属性使用$$[]
单行使用: win32:DEFINES += USE_MY_STUFF
多行使用{}
win32{
CONFIG(release, debug|release)
{
TARGET = AppExmple
LIBS += -lSARibbonBar -lSJUICore -llog4cxx
}
CONFIG(debug, debug|release)
{
TARGET = AppExmpled
LIBS += -lSARibbonBard -lSJUICored -llog4cxxd
}
}
P W D : 当 前 文 件 路 径 , 指 P R O 文 件 所 在 的 路 径 建 议 使 用 绝 对 路 径 : 使 用 PWD:当前文件路径,指PRO文件所在的路径 建议使用绝对路径:使用 PWD:当前文件路径,指PRO文件所在的路径建议使用绝对路径:使用PWD变量来指定路径,相对路径有的可能不正确。
opencv-python安装
pip install opencv-python -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
参考:
- Qt 窗口操作函数(置顶、全屏,最大化最小化按钮设置等)
- https://www.w3school.com.cn/css/css_boxmodel.asp
- 使用Qss设置QT程序界面的样式和皮肤
- http://blog.sina.com.cn/s/blog_a6fb6cc90101ed6n.html
- https://www.cnblogs.com/tingtaishou/p/12155574.html
- 树QSS
- https://www.jianshu.com/p/ab7853800d60
- Qt中QTimer和timerevent的区别与用法
- QT与VS环境 代码文件编码格式使用utf-8与带bom的utf-8的差异