本文介绍的是Qt 编程点滴,作为一名新手,我建议必须看一看。编程那些事,只有编程人员自己明白!所以推荐本文。

Qt 编程继续为大家讲解,还是接着文章Qt 编程点滴 初学者必看 (4) ,继续介绍,说编程那些细节。由于本话题是一节一节为大家介绍的,所以更多内容请看末尾编辑推荐。

Qt 编程点滴 初学者必看 (5)(qt编程入门)  第1张

QTreeWidget/QTreeView中的CheckStatus状态的级联更新

  1. voidGpsSideBar::on_treeWidget_itemChanged(QTreeWidgetItem*item,intcolumn)
  2. {
  3. if(!item||column!=0)
  4. return;
  5. Qt::CheckStatestate=item->checkState(0);
  6. QTreeWidgetItem*parent=item->parent();
  7. if(parent)
  8. {
  9. intnumber=0;
  10. intpartiallyCheckedNum=0;
  11. for(introw=0;row<parent->childCount();++row)
  12. {
  13. if(parent->child(row)->checkState(0)==Qt::Checked)
  14. ++number;
  15. if(parent->child(row)->checkState(0)==Qt::PartiallyChecked)
  16. ++partiallyCheckedNum;
  17. }
  18. if(number==0)
  19. {
  20. if(parent->checkState(0)!=Qt::Unchecked&&partiallyCheckedNum==0)
  21. parent->setCheckState(0,Qt::Unchecked);
  22. elseif(parent->checkState(0)!=Qt::PartiallyChecked&&partiallyCheckedNum>0)
  23. parent->setCheckState(0,Qt::PartiallyChecked);
  24. }
  25. elseif(number==parent->childCount())
  26. {
  27. if(parent->checkState(0)!=Qt::Checked)
  28. parent->setCheckState(0,Qt::Checked);
  29. }
  30. else
  31. {
  32. if(parent->checkState(0)!=Qt::PartiallyChecked)
  33. parent->setCheckState(0,Qt::PartiallyChecked);
  34. }
  35. }
  36. if(item->childCount()>0)
  37. {
  38. introw;
  39. if(state==Qt::Checked)
  40. {
  41. for(row=0;row<item->childCount();++row)
  42. {
  43. if(item->child(row)->checkState(0)!=Qt::Checked)
  44. item->child(row)->setCheckState(0,Qt::Checked);
  45. }
  46. }
  47. elseif(state==Qt::Unchecked)
  48. {
  49. for(row=0;row<item->childCount();++row)
  50. {
  51. if(item->child(row)->checkState(0)!=Qt::Unchecked)
  52. item->child(row)->setCheckState(0,Qt::Unchecked);
  53. }
  54. }
  55. }
  56. }

清空QtreeWidget/QTreeView所有结点(gpssidebar.cpp文件中提取):

  1. voidGpsSideBar::clearTreeWidget(QTreeWidget*treeWidget){
  2. while(treeWidget->topLevelItemCount()>0)
  3. {
  4. QtreeWidgetItem*parentItem=treeWidget->takeTopLevelItem(0);
  5. QListlist=parentItem->takeChildren();
  6. for(intj=0;j<list.size();j++)
  7. {
  8. QtreeWidgetItem*childItem=list.at(j);
  9. delete&GetGPSNestData(childItem);
  10. deletechildItem;
  11. }
  12. delete&GetGPSNestData(parentItem);
  13. deleteparentItem;
  14. }
  15. }

ini配置文件中的字段名是区分大小写的

  1. voidMainWindow::contextMenuEvent(QContextMenuEvent*event)
  2. {
  3. QMenumenu(this);
  4. menu.addAction(cutAct);
  5. menu.addAction(copyAct);
  6. menu.addAction(pasteAct);
  7. menu.exec(event->globalPos());
  8. }


让QLineEdit不弹出右键菜单:

  1. QLineEdit->setContextMenuPolicy(Qt::NoContextMenu);

计算坐标两点间的角度,有两种方法。

***种方法:

  1. doublecalcAngle(constQPointF&centerPos,constQPoint&pos)
  2. {
  3. doublepx1,px2,py1,py2;
  4. px1=centerPos.x();
  5. py1=centerPos.y();
  6. px2=pos.x();
  7. py2=pos.y();
  8. doublex=px2-px1;
  9. doubley=py2-py1;
  10. doublehyp=sqrt(pow(x,2)+pow(y,2));
  11. doublecos=x/hyp;
  12. doublerad=acos(cos);
  13. doubledeg=180/(M_PI/rad);
  14. if(y<0)
  15. {
  16. deg=-deg;
  17. }
  18. elseif((y==0)&&(x<0))
  19. {
  20. deg=180;
  21. }
  22. degdeg=deg+90;
  23. if(deg<0)
  24. {
  25. degdeg=deg+360;
  26. }
  27. returndeg;
  28. }

第二种方法:

  1. intcalcAngle(constdouble&sx,constdouble&sy,constdouble&dx,constdouble&dy)
  2. {
  3. doublex,y,k1,k2;
  4. x=dx-sx;
  5. y=dy-sy;
  6. if((x==0)&&(y==0))
  7. {
  8. return0;
  9. }
  10. if(x==0)
  11. {
  12. if(y<0)return0;////在X轴上时两种结果
  13. if(y>0)return180;
  14. }
  15. if(y==0)
  16. {
  17. if(x>0)return90;//在Y轴上时两种结果
  18. if(x<0)return270;
  19. }
  20. k1=0;//因为直线(L1)在Y轴上,所以方程为:y=0x+0;即Y=0;斜率为0
  21. k2=y/x;//直线(L2)的斜率为y/x,前面已经去除了x=0y=0的情况
  22. intresult=round(atan(fabs(k1-k2))*180/M_PI);
  23. //由于K1=0,所以a:=abs(k1-k2)/abs(1+k1*k2);
  24. if((x>0)&&(y<0))
  25. {
  26. result=90-result;
  27. }
  28. elseif((x>0)&&(y>0))
  29. {
  30. result=90+result;
  31. }
  32. elseif((x<0)&&(y>0))
  33. {
  34. result=270-result;
  35. }
  36. elseif((x<0)&&(y<0))
  37. {
  38. result=270+result;
  39. }
  40. returnresult;
  41. }
  1. voidMainWindow::setCurrentFile(constQString&fileName)
  2. {
  3. curFile=fileName;
  4. if(curFile.isEmpty())
  5. setWindowTitle(tr("RecentFiles"));
  6. else
  7. setWindowTitle(tr("%1-%2").arg(strippedName(curFile))
  8. .arg(tr("RecentFiles")));
  9. QSettingssettings("Trolltech","RecentFilesExample");
  10. QStringListfiles=settings.value("recentFileList").toStringList();
  11. files.removeAll(fileName);
  12. files.prepend(fileName);
  13. while(files.size()>MaxRecentFiles)
  14. files.removeLast();
  15. settings.setValue("recentFileList",files);


setMouseTracking(true)是打开鼠标移动跟踪,默认情况下只有在鼠标按下后才会发送QMouseMoveEvent()事件,打开鼠标移动跟踪后就能够随时发送了。

Qt获取mysql包含中文的值

  1. QStringlname2=QString::fromUtf8(query.value(0).toByteArray());
  2. qDebug()<
  3. QTreeWidgetItem::setData(intcolumn,introle,constQVariant&value)

用法:自定义一个类:

  1. classItemData
  2. {
  3. public:
  4. QStringname;
  5. intage;
  6. };
  7. Q_DECLARE_METATYPE(ItemData);

//把数据指针存入结点Data:

  1. voidGpsSideBar::setItemData(QTreeWidgetItem*item,ItemData*itemData)
  2. {
  3. //item->setData(0,Qt::UserRole,qVariantFromValue(ItemData(*itemData)));
  4. item->setData(0,Qt::UserRole,qVariantFromValue(int(itemData)));
  5. }
  6. //取值
  7. ItemData*GpsSideBar::GetGPSNestData(QTreeWidgetItem*item)
  8. {
  9. //returnqVariantValue(item->data(0,Qt::UserRole));
  10. returnreinterpret_cast(qVariantValue(item->data(0,Qt::UserRole)));
  11. }

在linux下运行designer不能正常显示中文的解决方法:

Qtconfig中设置font为Bitstream Charter,然后保存就OK了。

小结:本文主要介绍了在Qt 窗体的使用,通过Qt 编程点滴介绍,也给自己提高了编程过程中需要注意的细节问题,由于本话题是一节一节为大家展现的,所以更多内容,请看编辑推荐。

转载请说明出处
知优网 » Qt 编程点滴 初学者必看 (5)(qt编程入门)

发表评论

您需要后才能发表评论