目录
5.5 设置 QSS 的动态属性 -- setPropery
11. 让Qt的窗口最小化最大化及关闭按钮都消失 ( &~ 与 | )
14. 如何 死等 某异步函数执行完毕后,再执行其他函数 - QEventLoop::exec
15. 2 QComboBox 为空时,显示 提示语; 且自动补全
31.设置鼠标跟踪后,鼠标在子窗体上,父类无法获得鼠标移动事件
33.使用 QWebEngineView 出现花屏,或其他问题
34.用 QFile + QTextStream 读写文件提供效率
35.用 QFile.readAll() 读取 QSS 可能出现问题
40.QT 文本显示,文字太多则会自动省略号显示,如何去掉省略号呢?
41.QVideoWidget 播放视频,遇到画面闪烁的情况
42.将 QString 类型的 IP 地址转化成 int 型,再比较大小
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;