QT-功能点记录

这篇博客详细记录了多个使用QT开发时的关键功能和技巧,包括屏幕抓取、界面样式设置、QLabel的字体颜色调整、窗口透明效果、QSS应用、QComboBox样式定制、QMediaPlayer播放视频的问题以及Qt版本、编译器的选择和兼容性问题。还涵盖了Qt的QSettings、进程睡眠、事件循环、数据库操作、WebSocket重连、QEventLoop解决阻塞、窗口拖动、Qt图表模块、软件在高分屏上的适配等多个实用话题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1. 抓取当前屏幕

2. qt界面设置边框-样式表实现

3. QT QLabel设置字体和颜色

4. 窗口整体透明,但窗口内的控件不透明

5. 样式表

  5.1 QSpinBox,QTimeEdit

  5.2  QDialog设置圆角

  5.3 QSlider 滑块

 5.4  QRadioButton

 5.5  设置 QSS 的动态属性 -- setPropery

6. 半透明 遮罩

7.程序启动画面

8. 图片

8.1图片旋转

8.2 QT 控件导出为图片

9. QT对数字自动补0

10. 鼠标悬停在某窗口上,改变鼠标图片

11. 让Qt的窗口最小化最大化及关闭按钮都消失 ( &~ 与 | )

12. QSettings

12.1 字符串的序列化

12.2 QSettings读取带英文逗号的文本为空

13. QT 进程睡眠一段时间,其他 信号/槽 继续执行

14. 如何 死等 某异步函数执行完毕后,再执行其他函数 - QEventLoop::exec

15. QComboBox

15. 1 QComboBox 下拉列表样式

15. 2 QComboBox 为空时,显示 提示语; 且自动补全

16. QLabel 自动换行

17. QT 窗口拖动实现 - 两种方法

18. QT5 中文乱码解决方法

1、文件开头加入

2、QString 的方法

19. QT 数据库操作失败

20. Qt WebSocket 把网线后的重连通知

21.Qt webengine 模块,相关联的库

22.使用 QMediaPlayer 播放视频,黑屏现象

23.判断编译器类型、编译器版本、操作系统。

24. 软件设置最小化后, 再还原,所有子控件不刷新

25.获取标题栏高度

26.设置高分屏属性 以便支持高分辨率

27.Qtchart模块

28.使用 QEventLoop 解决耗时操作阻塞界面

29.无边框窗体 但 可以自由拉伸边框

30.QT 样式表不起作用

31.设置鼠标跟踪后,鼠标在子窗体上,父类无法获得鼠标移动事件

32.QT 容器,提升效率小技巧

33.使用 QWebEngineView 出现花屏,或其他问题

34.用 QFile + QTextStream 读写文件提供效率

35.用 QFile.readAll() 读取 QSS 可能出现问题

36.在尺寸改变的时候不重绘窗体

37.去掉获取焦点后的虚边框

38.判断当前Qt版本有没有某个模块

39.QTimer 定时器精度不够高问题

40.QT 文本显示,文字太多则会自动省略号显示,如何去掉省略号呢?

41.QVideoWidget 播放视频,遇到画面闪烁的情况

42.将 QString 类型的 IP 地址转化成 int 型,再比较大小

43. QT拦截 操作系统层的消息,如:系统休眠

44.QT 版本问题

45.QT 版本 最搭的编译器是哪个?

46.推荐的Qt论坛+个人博客+网站+群

47. C++ 与 QT 书籍推荐


1. 抓取当前屏幕

QPixmap m_loadPixmap = QPixmap::grabWindow(QApplication::desktop()->winId()); 

2. qt界面设置边框-样式表实现

ui->frame->setStyleSheet("#frame{border:2px solid #014F84}#background-color:#00d8ff");
// 2px  solid color 这个顺序不能错,就是这么坑人;

3. QT QLabel设置字体和颜色

//设置字号

QFont ft;
ft.setPointSize(12);
ui.label_4->setFont(ft);

//设置颜色
QPalette pa;
pa.setColor(QPalette::WindowText,Qt::red);
ui.label_4->setPalette(pa);

4. 窗口整体透明,但窗口内的控件不透明

// QT5 必须放在 ui->setupUi(this) 前;
setAttribute(Qt::WA_TranslucentBackground, true);

ui->setupUi(this);

5. 样式表

  5.1 QSpinBox,QTimeEdit

/*spinbox 抬起样式*/
QTimeEdit::up-button,QDoubleSpinBox::up-button,QSpinBox::up-button 
{
    subcontrol-origin:border;
    subcontrol-position:right;
    image: url(:/ico/up_right.png);
    width: 12px;
    height: 20px;       
}
QTimeEdit::down-button,QDoubleSpinBox::down-button,QSpinBox::down-button 
{
    subcontrol-origin:border;
    subcontrol-position:left;
    border-image: url(:/ico/up_left.png);
    width: 12px;
    height: 20px;
}
/*按钮按下样式*/
QTimeEdit::up-button:pressed,QDoubleSpinBox::up-button:pressed,QSpinBox::up-button:pressed
{
    subcontrol-origin:border;
    subcontrol-position:right;
    image: url(:/ico/pushed_right.png);
    width: 12px;
    height: 20px;       
}
  
QTimeEdit::down-button:pressed,QDoubleSpinBox::down-button:pressed, \
    QSpinBox::down-button:pressed,QSpinBox::down-button:pressed
{
    subcontrol-position:left;
    image: url(:/ico/pushed_left.png);
    width: 12px;
    height: 20px;
}

  5.2  QDialog设置圆角

// 1. QDialog 构造函数中,其中 juxing.png 为圆角图片;
QPixmap pm(":/subject/Resources/YingYu/juxing.png");
setMask(pm.mask());

// 2. 样式表中 写
QDialog#Dialog_ENYinBiao
{
    ... ...
    border-radius:1em;
}

  5.3 QSlider 滑块

// 水平 用 horizontal
// 垂直 用 vertical 
// 以水平为例,如下:

//首先是设置主体
QSlider#horizontalSlider_Pen{
    width: 493;
    height: 40;
    border:0px;
    opacity: 0.7;
}
/* 滑块 QSlider - handle */
QSlider#horizontalSlider_Pen::handle:horizontal{
    width: 30;
    height: 30;
    border:0px;
    opacity: 0.7;
    margin-left:30px; 
    margin-right:40px; 
    background-image: url(:/PenDialog/Resources/slider_handle.png);
}
/* 滑槽 QSlider - groove */
QSlider#horizontalSlider_Pen::groove:horizontal{
    width: 575;
    height: 34;
    border:0px;
    opacity: 0.7;
    background-image: url(:/PenDialog/Resources/slider_groove.png);
}

//还没有滑上去的地方
QSlider::add-page:horizontal
{
    background: qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, stop:0 #bcbcbc, stop:0.25 #bcbcbc, stop:0.5 #bcbcbc, stop:1 #bcbcbc); 

}

//已经划过的从地方
QSlider::sub-page:horizontal
{                               
     background: qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, stop:0 #439cf3, stop:0.25 #439cf3, stop:0.5 #439cf3, stop:1 #439cf3);                     
}

 5.4  QRadioButton

QRadioButton {
    spacing: 5px;
    font-size: 14px;
    color: rgb(24, 220, 88);   # 连同 font-size一齐设置按钮的文本样式
}

QRadioButton::indicator {   # indicator是一个子组件,这里的width和height分别指定按钮的宽和高
    width: 13px;
    height: 13px;
}
 
QRadioButton::indicator::unchecked {   # 未选中时状态,也即正常状态
    image: url(:/images/radiobutton_unchecked.png);
}
 
QRadioButton::indicator:unchecked:hover {   # 未选中时,鼠标悬停时的状态
    image: url(:/images/radiobutton_unchecked_hover.png);
}
 
QRadioButton::indicator:unchecked:pressed {   #未选中时,按钮下按时的状态
    image: url(:/images/radiobutton_unchecked_pressed.png);
}
 
QRadioButton::indicator::checked {   # 按钮选中时的状态
    image: url(:/images/radiobutton_checked.png);
}
 
QRadioButton::indicator:checked:hover {   # 按钮选中时,鼠标悬停状态
    image: url(:/images/radiobutton_checked_hover.png);
}
 
QRadioButton::indicator:checked:pressed { # 按钮选中时,鼠标下按时的状态
    image: url(:/images/radiobutton_checked_pressed.png);
}

QRadioButton::indicator:disabled {  # 按钮禁用时的状态
    image: url(:/buttonbg/radio_disable);
}

 5.5  设置 QSS 的动态属性 -- setPropery

// 在代码中
iconLabel->setProperty("labelState", "hover");
textLabel->setProperty("labelState", "hover");

// 在 QSS 文件中
QLabel#objectname[labelState="hover"]
{
  image: url(:/Resouces/images/refresh.png);
}

/*鼠标划过按钮显示的文字样式*/
QLabel#objectname[labelState="hover"]
{
  color:rgb(0 ,255 , 252);
}

6. 半透明 遮罩

    //添加黑色遮罩
    QWidget *mask = new QWidget;
    mask->setAutoFillBackground(true);
    mask->setPalette(QPalette(QColor(0, 0, 0, 50)));//alpha为不透明度
    mask->resize(900, 600);

7.程序启动画面

    QApplication  app(argc, argv);
    
    //QTime提供了闹钟功能
    qsrand(QTime(0, 0, 0).secsTo(QTime::currentTime()));//secsTo()为返回当前的秒数
    
    QPixmap pix(":/images/logo.png");
    QSplashScreen splash(pix);
    splash.resize(pix.size());
    splash.show();

    app.processEvents();//调用该函数的目的是为了使程序在启动画面的同时仍然能够响应鼠标事件

    ...  ...

    splash.finish(&view);//当窗口view完成初始化工作后就结束启动画面

    app.exec();

8. 图片

8.1图片旋转

  QT 图片旋转函数 QPainter::rotate() -- 以图片中心为旋转点,不能随意设置旋转点

    QPainter painter(this);
    painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform | QPainter::TextAntialiasing);

    QPoint center(this->rect().center());
    painter.translate(center);  //让图片的中心作为旋转的中心
    painter.rotate(-m_angle);   //顺时针旋转 -m_angle 度
    painter.translate(-center); //使原点复原

8.2 QT 控件导出为图片

1、 QWidget

QPixmap QWidget::grab(const QRect &rectangle = QRect(QPoint(0, 0), QSize(-1, -1)))


2、QPixmap

QPixmap pixmap = QPixmap::grabWidget(ui->tableWidget);
pixmap.save("D://123.png");

 

 

9. QT对数字自动补0

QString str = QString("%1").arg(12, 5, 10, QLatin1Char('0'));

// 结果: 00012
// 说明: 将数字 12 转成 10 进制的 5 位字符串,在前面自动补 0

10. 鼠标悬停在某窗口上,改变鼠标图片

QPushButton * m_btnMove = new QPushButton(); 
m_btnMove->setCursor(QCursor(Qt::SizeAllCursor));
// setCursor() 表示鼠标在窗体 m_btnMove 上时,改变鼠标图片

11. 让Qt的窗口最小化最大化及关闭按钮都消失 ( &~ 与 | )


// Qt::WindowCloseButtonHint其实是一个值 0x00080000
// 这里的“&~”是取反以后再按位与的意思,下面的“|”是按位或的意思。

// 可以使不想要的按钮消失掉,但是frame的框框还存在。
setWindowFlags(windowFlags()&~ Qt::WindowMinMaxButtonsHint);
setWindowFlags(windowFlags()&~ Qt::WindowCloseButtonHint);   

// 但是如果都不想要的时候,一起使用的时候就无效了。
setWindowFlags(windowFlags()&~ (Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint));

// 但如果固定窗口的大小,那么这个全部都屏蔽掉的方案就成功了。
setFixedSize(679, 423);
setWindowFlags(windowFlags()&~ (Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint))

12. QSettings

12.1 字符串的序列化

字符串序列化

  • 主要是对字符的Escape,比如'\0','\a'等控制字符,变成"\\0", "\\a"等
  • 其他控制字符,"\\x.."
  • 大于 7F 的字符,如有codec,则使用codec,如无,则用"\\x...."
  • 字符串内包含 ';'   ','   '='  时,字符串两段加引号
  • 字符'\0', "\x.."之后如果是数字(0-9a-fA-F),要继续如此处理

12.2 QSettings读取带英文逗号的文本为空

QSettings::value读取本地 ini 文档的值,有一项值是用于存储类似123,456,144,55,555 的值,但有英文逗号的话读出就是空

QSettings qSettings("user_config.ini",QSettings::IniFormat);
qSettings.setIniCodec("utf-8");	

ui.editCode->setText(qSettings.value("all_setting/c_code").toString().trimmed());

后来才知道可以用 toStringList 直接存到 QStringList 里面

QStringList listSubCti = qSettings.value("hg_config/hadSubAccounts").toStringList();//324,327 逗号分隔

13. QT 进程睡眠一段时间,其他 信号/槽 继续执行

QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents, 100);
QThread::msleep(100);

14. 如何 死等 某异步函数执行完毕后,再执行其他函数 - QEventLoop::exec

QNetworkAccessManager *manager = new QNetworkAccessManager;
QNetworkReply *reply;
QNetworkRequest httpRequest = QNetworkRequest(QUrl(urlHW));
httpRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/octet-stream");

reply = manager->post(httpRequest, dateHW.toLatin1());

QEventLoop loop;
QObject::connect(manager, SIGNAL(finished(QNetworkReply*)), &loop, SLOT(quit()));
loop.exec();

if (reply->error() == QNetworkReply::NoError)
{
    QString resultMsg = reply->readAll();

}
else
{
    qDebug() << "post file error " << reply->error() << reply->errorString();
}

reply->deleteLater();
delete manager;

15.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值