Qt5 用法细节记录
const 修饰类函数
void xxClass::fun() const
{
//类成员变量是不能在函数中赋值的
}
QMap 删除误区
QMap<QString, QWidget*>WidgetMap;
//第一种删除容器中的值 **失败**
QMap<QString, QWidget*> CustomMapTabWidget::getWidgetMap()
{
return WidgetMap;
}
delete getWidgetMap().take(key);
//第二种删除容器中的值 **失败**
QMap<QString, QWidget*> & CustomMapTabWidget::getWidgetMap()
{
return WidgetMap;
}
delete getWidgetMap().take(key);
//第三种删除 **成功**
int CustomMapTabWidget::removeWidgetMap(const QString &key)
{
if(!WidgetMap[key]){
return -1;
}
delete WidgetMap[key];
return WidgetMap.remove(key);
}
界面去焦点(虚框)
QWidget.setFocusPolicy(Qt::NoFocus); //去焦点,去界面焦点虚框
QSS写法: QWidget:focus{outline: none;}/*设置所有QWidget及其子类焦点框隐藏*/
QListView默认选中某一行
QStringListModel *pQStringListModel = new QStringListModel (ui->listView);
void RobotTaskForm::initListView(const QStringList& list)
{
pQStringListModel->setStringList(list);
ui->listView->setCurrentIndex(pQStringListModel->index(list.size()-1,0));
ui->listView->clicked(ui->listView->currentIndex());
ui->listView->update();
}
paint 透明图片
QPixmap map("xxx/xxx.png");
QImage img(map.toImage());
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
painter.setRenderHint(QPainter::SmoothPixmapTransform);
QPainter::PixmapFragment qpf = QPainter::PixmapFragment::create(dstr.center(),img.rect(),
dstr.width()*1.0f/img.width(),
dstr.height()*1.0f/img.height(),0,0.9);
painter.drawPixmapFragments(&qpf,1,QPixmap::fromImage(img));
忽略的QListWidget的 count
int row = ui->listWidget->count();
qDebug()<<"ui->listWidget->count(): before: "<<ui->listWidget->count();//0
QListWidgetItem *item = new QListWidgetItem(ui->listWidget);
qDebug()<<"ui->listWidget->count(): after: "<<ui->listWidget->count();//1
RobotTaskListMenuCell* cell = new RobotTaskListMenuCell(ui->listWidget);
connect(cell,SIGNAL(sigRobotTaskListMenuCell(int)),this,SLOT(slotRobotTaskListMenuCell(int)));
cell->setRow(row);
cell->init(fileInfo);
item->setSizeHint(QSize(ui->listWidget->width(),75));
ui->listWidget->setItemWidget(item,cell);
忽略的QMap的细节
QMap<QString,QWidget*>RobotListWidgetCellMap;//空的QMap容器(size为0)
for(int i=0;i<RobotListWidgetCellMap.keys().size();++i){ //未打印
qDebug()<<"key000: "<<RobotListWidgetCellMap.keys().at(i);
}
if(!RobotListWidgetCellMap.value(ip)){//未打印
for(int i=0;i<RobotListWidgetCellMap.keys().size();++i){
qDebug()<<"key111: "<<RobotListWidgetCellMap.keys().at(i);
}
}
if(!RobotListWidgetCellMap[ip]){//此判断后,如果key为空则把ip值插入(size变为1)
for(int i=0;i<RobotListWidgetCellMap.keys().size();++i){//打印
qDebug()<<"key222: "<<RobotListWidgetCellMap.keys().at(i);
}
}
结果:key222: "xxxx"
类成员静态变量的作用域
一个c++类的静态成员变量在这个类对象被销毁时,这个静态成员变量依然存在,记得在析构中清理这个静态成员变量的数据。
QGraphicsItem 放大到一定大小会消失问题
QGraphicsItem中的的::boundingRect() const{ return QPainterPath;} 中的 QPainterPath 区域小于paintEvent函数中的区域导致的
注意 .pro .pri中 \ 反斜杠
因为箭头处有反斜杠,导致报下面的警告, 作为强迫症患者, 看着很不爽, 就查了一下发现这个问题。 反斜杠最后加个空格。与自动生成的文件添加格式一致。跟着Qt creator规范走肯定没错。
c++ 继承关系
–
//A.h
#ifndef A_H
#define A_H
#include <QDebug>
class Base{
public:
Base(){}
void print(){
qDebug()<<_index;
}
int _index = 0;
};
class A : public Base
{
public:
explicit A(){}
};
class B : public Base
{
public:
explicit B(){}
};
class C : public A ,public B
{
public:
explicit C(){
Base::_index = 0;
qDebug()<<"--------[Base::_index = 0]---------";
qDebug()<<"A"<<A::_index<<"B:"<<B::_index<<"Base:"<<Base::_index;
A::_index = 1;
qDebug()<<"--------[A::_index = 1]---------";
qDebug()<<"A"<<A::_index<<"B:"<<B::_index<<"Base:"<<Base::_index;
B::_index = 2;
qDebug()<<"--------[B::_index = 1]---------";
qDebug()<<"A"<<A::_index<<"B:"<<B::_index<<"Base:"<<Base::_index;
}
};
#endif // A_H
//main.cpp
#include <QApplication>
#include "A.h"
int main(int argc, char *argv[])
{
QApplication app(argc,argv);
C c;
qDebug()<<"--------c.Base::print()--------";
c.Base::print();
qDebug()<<"--------c.A::print()--------";
c.A::print();
qDebug()<<"--------c.B::print()--------";
c.B::print();
return app.exec();
}
//输出结果
--------[Base::_index = 0]---------
A 0 B: 0 Base: 0
--------[A::_index = 1]---------
A 1 B: 0 Base: 1
--------[B::_index = 1]---------
A 1 B: 2 Base: 1
--------c.Base::print()--------
1
--------c.A::print()--------
1
--------c.B::print()--------
2
得出结论:
当A,B继承Base, C继承,A,B时得出。
class C : public A ,public B
C 类中的 Base::_index 是等于声明最近的类 即: A::_index
class C : public B ,public A
C 类中的 Base::_index 是等于声明最近的类 即:B::_index
double to QString 保留大于6位小数
double x = 0.012312312321;
qDebug()<<"x:"<<x<<QString::number(x,'g',16);
//输出
x: 0.0123123 "0.012312312321"
QTableView 排序的秘密
QTableWidgetItem* item = new QTableWidgetItem();
//按字母排序
item->setText("2");
//按数值排序
item->setData(Qt::DisplayRole, 2);
//将第column列降序排列
TableWidget->sortItem(column, Qt::DescendingOrder);