继续记录一些Qt开发中的技巧操作:
1.滚动部件的滑动问题
再Linux嵌入式设备上,有时候一个页面的子部件太多,一屏放不下是需要做页面滑动,可以使用“QScrollArea”控件,拖来一个“QScrollArea”控件,将子部件放置在“QScrollArea”自带的“scrollAreaWidgetContents”中。这样就可以拖动了么,实际不行,还需要专门设置滑动:
//设置滑动
ui->scrollArea->verticalScrollBar()->style()->polish(ui->scrollArea->verticalScrollBar());
QScroller::ScrollerGestureType gesture = QScroller::LeftMouseButtonGesture;
QScroller::scroller(ui->scrollArea)->grabGesture(ui->scrollArea, gesture);
ui->scrollArea->verticalScrollBar()->setValue(0);
或者这样写:
QScroller *scroller = QScroller::scroller(ui->scrollAreaUpper->viewport());
scroller->grabGesture(ui->scrollAreaUpper->viewport(), QScroller::LeftMouseButtonGesture);
这样就可以随着手指滑动了。
但有时候会遇到划不动的情况,仔细看父窗口有QScrollArea部件,这个父窗口会弹出个子窗口,子窗口里边也有QScrollArea部件,你就会发现父窗口可以滑动,但子窗口不能滑动。这是由于两个QScrollArea部件都设置了“QScroller::LeftMouseButtonGesture”,你只需将其中一个改为“QScroller::TouchGesture”类型就互不影响了。
2.Qt设置时区问题
在一些跨国项目中,经常会碰到时区问题。设备上显示“14:00:00”,时间传到后台,后台显示“18:00:00”,这是由于设备和后台使用不同的时区对时间戳进行转换造成的。Qt中,有专门处理时间和时区的函数。
// 获取当前时间
QTime time = QTime::currentTime();
//判断是否有效的时间
bool valid = time.isValid(); // 返回false
// 增加1小时
time = time.addSecs(3600);
// 增加1秒
time = time.addMSecs(1000);
QTime startTime(12, 0, 0); // 12:00:00
// 计算两个时间之间的秒数差值
int diff = startTime.secsTo(time);
//检测时间段
QTime timer;
timer.start();
// 第一段代码,restart开始
int elapsed1 = timer.restart();
// 第二段代码,elapsed结束
int elapsed2 = timer.elapsed();
//获取当前日期时间
QDateTime datetime = QDateTime::currentDateTime();
//时间转字符串
QString strReportTime = datetime.toString("yyyy/MM/dd hh:mm:ss");
QDateTime datetime2;
//字符串转时间
datetime2.fromString(strReportTime , "yyyy/MM/dd hh:mm:ss");
//设置时区
datetime.setTimeZone(QTimeZone("Asia/Shanghai"));
QString timeString = datetime.toString(Qt::ISODate);
//更新时区信息
QTimeZonePrivate::instance()->updateZoneInfo(QDir("/usr/share/zoneinfo"));
//获取以0时区为基准的日期时间
QDateTime utcTime = QDateTime::currentDateTimeUtc();
QDateTime localTime = utcTime.toLocalTime();
logger()->info() << __FUNCTION__ << "UTC time: " << utcTime.toString(Qt::ISODate);
logger()->info() << __FUNCTION__ << "Local time: " << localTime.toString(Qt::ISODate);
3.自定义窗体样式不生效问题
我们在开发过程中,经常需要自定义一些继承自QWidget的窗体,作为其他窗体的组件胡总和子窗体,这时候,你会发现在设计器中,设置的自定义窗体自身的样式,无法生效,设置的背景,颜色什么的,都没有表现出来,这是由于继承自QWidget的自定义窗体的样式不能再使用设计器里边的样式设置,而需要以读文件的形式来设置窗体样式。如下:
//自定义的窗体可以设置内部子部件样式,但没法直接设置自身样式,必须要通过读文件的形式
this->setAttribute(Qt::WA_StyledBackground);
QFile qss(":/qss/qssStyle/FormStyle.qss");
if (qss.open(QFile::ReadOnly))
{
QString style = QLatin1String(qss.readAll());
this->setStyleSheet(style);
qss.close();
}
当然,你也可以让自定义窗体改为继承自QFrame,因为QFrame自带paintEvent函数已做了实现,在使用样式表时会进行解析和绘制。
4.编码格式问题
有时候我们代码中包含中文时,会经常遇到下面这些报错,其实有指向性的就是“C2001:常量中有换行符”,你可以网上去查找,这是由于编码格式引起的,程序中有对中文编码格式处理,而文件格式不是中文格式。
解决方案考虑下面几种,可以依次尝试:
(1).“QT界面菜单栏->工具->选项->文本编辑器,修改成如果编码是UTF-8则添加”
(2)“QT界面菜单栏->编辑->Slect Encoding…->UTF-8->按编码保存”,进行修改。
(3)在头文件加上UTF-8的配置:“#pragma execution_character_set(“utf-8”)”
(4)在工程文件(.pro)中加上一下配置代码(这种一般是由于MSVC编译,而源代码文件是无BOM的utf-8编码格式)
msvc{
QMAKE_CFLAGS += /utf-8
QMAKE_CXXFLAGS += /utf-8
}
5.标签文字对齐无效果
使用QLabel标签时,如果在样式表中直接写文字的对齐方式,“text-align: left center;”不管你是写右对齐还是居中对齐,都会以默认的左对齐显示,毫无效果。这就需要在设计器里直接指定对齐方式,或者使用代码的形式设置对齐方式。
label->setAlignment(Qt::AlignCenter);
或者
6.给按钮左边加个图
像下面这个,给返回按钮的左边加一个表示返回的图片呢?
使用样式表是个不错的方式,当然你也可以用其他方式,甚至可以自定义个按钮部件来实现。
QPushButton#btUpdateBack{
/*图片*/
background-image: url(:/image/Image/back-top.png);
background-repeat: no-repeat;
background-origin: padding;
/*重点:在指定的位置放图片*/
background-position: left center;
/*重点:内边距推50px刚好放下图片*/
padding-left:50px;
color: rgba(66, 66, 66, 1);
font: bold normal 40px "Source Han Sans CN";
background-color: transparent;
border-color: transparent;
outline: none;
text-align: left center;
}
7.最小化后的卡死假象
有时候执行最小化,然后重新恢复时,发现界面可能会出现好像卡死的情况,可以重写showEvent事件,并加上“setAttribute(Qt::WA_Mapped);”以避免。
void showEvent(QShowEvent *e)
{
if(event->type() == QEvent::WindowStateChange)
{
if(!isMinimized())
{
setAttribute(Qt::WA_Mapped);
}
}
QWidget::showEvent(e);
}