QT样式修改

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

  1. 使用setStyleSheet

      背景颜色和背景图片可以同时设置(background-color、background-image),存在以下行为:图片路径无法正确解析时,只显示背景颜色;图片可以解析时,按设置方式显示图片,而在图片范围外显示背景颜色。默认的图片显示位置为左上角,填充方式是平铺。这两个可以通过background-position、background-repeat来调整。
    
     存在问题:这种方式设置的图片都是按原图大小进行显示,不能进行缩放。而且url只能填入路径,不能是一个QPixmap,所以也无法通过调整图片大小来缩放显示。所以只能实现“居中”、”平铺”两种形式,而无法实现“缩放”、“拉伸”
    
     一种替代方式是使用border-image属性,这种方法显示的图片就是图片调整到widget大小再显示,实现”拉伸”形式。同样无法实现缩放。这种方法不够灵活。
    
  2. 使用画板QPalette

     这种方式是通过给QPalette设置QBrush画刷来设置背景的,最有用的地方在于它可以设置QPixmap,使得背景图片可以按照我们想要的大小进行变化,可以轻松实现”拉伸”方式。
    
     存在问题:这种方法会以平铺的方式填充满整个widget,即使你把图片scale到自己想到的大小,剩余的地方也会被填充。所以这种方式只能实现“平铺”、“拉伸”,而无法实现“居中”、“缩放”。
    
  3. 重写paintEvent方法

      这种方法是最灵活的,可以按照自己想要的任何方式描绘背景。可以实现“居中”、“平铺”、“缩放”、“拉伸”。
    
     存在问题:因为背景如何显示全部要自己手动实现,需要精确的坐标计算图片的显示位置。特别是“平铺”方式,需要根据widget大小和图片的大小先判断出要重复画多少次图,还要计算每一次图的起点。
    
  4. 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;
}
透明效果
  1. //不显示标题栏,亦无边框
    setWindowFlags(windowFlags() | Qt::FramelessWindowHint);
    setAttribute(Qt::WA_TranslucentBackground, true);

  2. //setWindowOpacity(0.5);

  3. // 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 项目中,中文错误有两种方法:

  1. 就是用utf-8编码 在 .cpp 中 最上端添加以上代码,设置程序的编码格式

#pragma execution_character_set(“utf-8”)

  1. 使用宏,相当于编码转换了一下,还是用原来的编码格式

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文件所在的路径 建议使用绝对路径:使用 PWDPRO使使PWD变量来指定路径,相对路径有的可能不正确。

opencv-python安装

pip install opencv-python -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com

参考:

  1. Qt 窗口操作函数(置顶、全屏,最大化最小化按钮设置等)
  2. https://www.w3school.com.cn/css/css_boxmodel.asp
  3. 使用Qss设置QT程序界面的样式和皮肤
  4. http://blog.sina.com.cn/s/blog_a6fb6cc90101ed6n.html
  5. https://www.cnblogs.com/tingtaishou/p/12155574.html
  6. 树QSS
  7. https://www.jianshu.com/p/ab7853800d60
  8. Qt中QTimer和timerevent的区别与用法
  9. QT与VS环境 代码文件编码格式使用utf-8与带bom的utf-8的差异
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

baibingql

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值