本文介绍的是Qt 编程点滴,作为一名新手,我建议必须看一看。编程那些事,只有编程人员自己明白!所以推荐本文。
Qt 编程继续为大家讲解,还是接着文章Qt 编程点滴 初学者必看 (4) ,继续介绍,说编程那些细节。由于本话题是一节一节为大家介绍的,所以更多内容请看末尾编辑推荐。
QTreeWidget/QTreeView中的CheckStatus状态的级联更新
- voidGpsSideBar::on_treeWidget_itemChanged(QTreeWidgetItem*item,intcolumn)
- {
- if(!item||column!=0)
- return;
- Qt::CheckStatestate=item->checkState(0);
- QTreeWidgetItem*parent=item->parent();
- if(parent)
- {
- intnumber=0;
- intpartiallyCheckedNum=0;
- for(introw=0;row<parent->childCount();++row)
- {
- if(parent->child(row)->checkState(0)==Qt::Checked)
- ++number;
- if(parent->child(row)->checkState(0)==Qt::PartiallyChecked)
- ++partiallyCheckedNum;
- }
- if(number==0)
- {
- if(parent->checkState(0)!=Qt::Unchecked&&partiallyCheckedNum==0)
- parent->setCheckState(0,Qt::Unchecked);
- elseif(parent->checkState(0)!=Qt::PartiallyChecked&&partiallyCheckedNum>0)
- parent->setCheckState(0,Qt::PartiallyChecked);
- }
- elseif(number==parent->childCount())
- {
- if(parent->checkState(0)!=Qt::Checked)
- parent->setCheckState(0,Qt::Checked);
- }
- else
- {
- if(parent->checkState(0)!=Qt::PartiallyChecked)
- parent->setCheckState(0,Qt::PartiallyChecked);
- }
- }
- if(item->childCount()>0)
- {
- introw;
- if(state==Qt::Checked)
- {
- for(row=0;row<item->childCount();++row)
- {
- if(item->child(row)->checkState(0)!=Qt::Checked)
- item->child(row)->setCheckState(0,Qt::Checked);
- }
- }
- elseif(state==Qt::Unchecked)
- {
- for(row=0;row<item->childCount();++row)
- {
- if(item->child(row)->checkState(0)!=Qt::Unchecked)
- item->child(row)->setCheckState(0,Qt::Unchecked);
- }
- }
- }
- }
清空QtreeWidget/QTreeView所有结点(gpssidebar.cpp文件中提取):
- voidGpsSideBar::clearTreeWidget(QTreeWidget*treeWidget){
- while(treeWidget->topLevelItemCount()>0)
- {
- QtreeWidgetItem*parentItem=treeWidget->takeTopLevelItem(0);
- QListlist=parentItem->takeChildren();
- for(intj=0;j<list.size();j++)
- {
- QtreeWidgetItem*childItem=list.at(j);
- delete&GetGPSNestData(childItem);
- deletechildItem;
- }
- delete&GetGPSNestData(parentItem);
- deleteparentItem;
- }
- }
ini配置文件中的字段名是区分大小写的
- voidMainWindow::contextMenuEvent(QContextMenuEvent*event)
- {
- QMenumenu(this);
- menu.addAction(cutAct);
- menu.addAction(copyAct);
- menu.addAction(pasteAct);
- menu.exec(event->globalPos());
- }
让QLineEdit不弹出右键菜单:
- QLineEdit->setContextMenuPolicy(Qt::NoContextMenu);
计算坐标两点间的角度,有两种方法。
***种方法:
- doublecalcAngle(constQPointF¢erPos,constQPoint&pos)
- {
- doublepx1,px2,py1,py2;
- px1=centerPos.x();
- py1=centerPos.y();
- px2=pos.x();
- py2=pos.y();
- doublex=px2-px1;
- doubley=py2-py1;
- doublehyp=sqrt(pow(x,2)+pow(y,2));
- doublecos=x/hyp;
- doublerad=acos(cos);
- doubledeg=180/(M_PI/rad);
- if(y<0)
- {
- deg=-deg;
- }
- elseif((y==0)&&(x<0))
- {
- deg=180;
- }
- degdeg=deg+90;
- if(deg<0)
- {
- degdeg=deg+360;
- }
- returndeg;
- }
第二种方法:
- intcalcAngle(constdouble&sx,constdouble&sy,constdouble&dx,constdouble&dy)
- {
- doublex,y,k1,k2;
- x=dx-sx;
- y=dy-sy;
- if((x==0)&&(y==0))
- {
- return0;
- }
- if(x==0)
- {
- if(y<0)return0;////在X轴上时两种结果
- if(y>0)return180;
- }
- if(y==0)
- {
- if(x>0)return90;//在Y轴上时两种结果
- if(x<0)return270;
- }
- k1=0;//因为直线(L1)在Y轴上,所以方程为:y=0x+0;即Y=0;斜率为0
- k2=y/x;//直线(L2)的斜率为y/x,前面已经去除了x=0或y=0的情况
- intresult=round(atan(fabs(k1-k2))*180/M_PI);
- //由于K1=0,所以a:=abs(k1-k2)/abs(1+k1*k2);
- if((x>0)&&(y<0))
- {
- result=90-result;
- }
- elseif((x>0)&&(y>0))
- {
- result=90+result;
- }
- elseif((x<0)&&(y>0))
- {
- result=270-result;
- }
- elseif((x<0)&&(y<0))
- {
- result=270+result;
- }
- returnresult;
- }
- voidMainWindow::setCurrentFile(constQString&fileName)
- {
- curFile=fileName;
- if(curFile.isEmpty())
- setWindowTitle(tr("RecentFiles"));
- else
- setWindowTitle(tr("%1-%2").arg(strippedName(curFile))
- .arg(tr("RecentFiles")));
- QSettingssettings("Trolltech","RecentFilesExample");
- QStringListfiles=settings.value("recentFileList").toStringList();
- files.removeAll(fileName);
- files.prepend(fileName);
- while(files.size()>MaxRecentFiles)
- files.removeLast();
- settings.setValue("recentFileList",files);
setMouseTracking(true)是打开鼠标移动跟踪,默认情况下只有在鼠标按下后才会发送QMouseMoveEvent()事件,打开鼠标移动跟踪后就能够随时发送了。
Qt获取mysql包含中文的值
- QStringlname2=QString::fromUtf8(query.value(0).toByteArray());
- qDebug()<
- QTreeWidgetItem::setData(intcolumn,introle,constQVariant&value)
用法:自定义一个类:
- classItemData
- {
- public:
- QStringname;
- intage;
- };
- Q_DECLARE_METATYPE(ItemData);
//把数据指针存入结点Data:
- voidGpsSideBar::setItemData(QTreeWidgetItem*item,ItemData*itemData)
- {
- //item->setData(0,Qt::UserRole,qVariantFromValue(ItemData(*itemData)));
- item->setData(0,Qt::UserRole,qVariantFromValue(int(itemData)));
- }
- //取值
- ItemData*GpsSideBar::GetGPSNestData(QTreeWidgetItem*item)
- {
- //returnqVariantValue(item->data(0,Qt::UserRole));
- returnreinterpret_cast(qVariantValue(item->data(0,Qt::UserRole)));
- }
在linux下运行designer不能正常显示中文的解决方法:
在Qtconfig中设置font为Bitstream Charter,然后保存就OK了。
小结:本文主要介绍了在Qt 窗体的使用,通过Qt 编程点滴介绍,也给自己提高了编程过程中需要注意的细节问题,由于本话题是一节一节为大家展现的,所以更多内容,请看编辑推荐。
转载请说明出处
知优网 » Qt 编程点滴 初学者必看 (5)(qt编程入门)
知优网 » Qt 编程点滴 初学者必看 (5)(qt编程入门)