⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 menutool.cc

📁 c++的guiQt做的开发
💻 CC
📖 第 1 页 / 共 3 页
字号:
 return name[pos+1].toLower().toAscii();}/** Slot invoked on receiving a help text @param message help text received*/void MenuTool::receiveHelpText(const QString &message) { emit helpText(message);}/** Slot invoked when clicked on a menu item @param item Item that was clicked*/void MenuTool::menuActivated(QAction *item) { emit action(getAction(item));}/** Slot invoked when clicked on a toolbar item @param item Item that was clicked*/void MenuTool::itemActivated(ToolButton *item) { emit action(getAction(item));}/** Load one menu or toolbar item and insert it into parent menu or toolbar. If inserting into toolbar and name refers to special toobar item, that item is inserted and rest of parameters are ignored @param parentName Name of parent menu/toolbar. If NULL/empty, main menubar is the parent @param name Name of the item. Have to be unique. ("" or "-" will insert separator and ignore rest of parameters) @param caption Caption of item @param action Script to execute when the item is selected @param accel Keyboard Accelerator @param icon Name of icon @param classes Item classes */void MenuTool::createItem(const QString &parentName,const QString &name,const QString &caption,const QString &action,const QString &accel/*=QString::null*/,const QString &icon/*=QString::null*/,const QStringList &classes/*=QStringList()*/) throw (InvalidMenuException) { /** \todo check for duplicate names (mapTool, mapMenu) */ QMenu *parent=NULL; QMenuBar *parentMb=NULL; if (parentName.isNull() || parentName=="") {  //Check for main menubar  parentMb=menubar;  assert(parentMb); } else if (mCache.contains(parentName)) {  //Check for some specific submenu  parent=mCache[parentName];  assert(parent); } if (parent) {  //Insert into menu  if (name=="-" || name=="") {   parent->addSeparator();  } else {   addItem(parent,name,caption,action,accel,icon,classes);   //Create accels if not specified for this last item   optimizeItems(parent);  } } else if (parentMb) {  //Insert into main menubar  if (name=="-" || name=="") {   parentMb->addSeparator();  } else {   /** \todo add single item to main menubar */   //addItem(parentMb,name,caption,action,accel,icon,classes);  } } else {  ToolBar *tb=getToolbar(parentName);  if (tb) {   if (name=="-" || name=="") {    tb->addSeparator();    return;   }   //Try special item (this includes separator too)   QWidget *spec_tb=specialItem(tb,name,mainWindow);   if (spec_tb) {    //special toolbar buttons are added to list with their full parameters    addToMap(name,spec_tb);    return;   }   //Create ordinary item   //ToolButton *tbutton=   createToolBarItem(tb,name,caption,action,accel,icon,classes);  } else {   warn("Toolbar/menu to install into not found: " + parentName);  } }}/** Get first string from QStringList iterator and advance iterator one item further. Return QString::null if at ending position "end" @param it iterator @param end iterator marking ending position @return currrent iterator item or QString::null if after the end*/QString MenuTool::pop(QStringList::ConstIterator &it,const QStringList::ConstIterator &end) { if (it==end) return QString::null; QString res=*it; ++it; return res;}/** Add menu item specified by given data to parent @param line Line containing menu item specification @param parent parent menu in which this item will be appended @param name Name of this item (key in settings).*/void MenuTool::addItem(QString line,QMenu *parent,const QString &name/*=QString::null*/) throw (InvalidMenuException) { line=line.remove(0,5); //Format: Caption, Action,[,accelerator, [,menu icon]] QStringList qs=explode(MENUDEF_SEPARATOR,line,true); if (qs.count()<2) invalidItem(QObject::tr("menu item"),name,line,QObject::tr("2 or more parameters in item definition")); QStringList::ConstIterator it=qs.begin(); QStringList::ConstIterator it_end=qs.end(); QString caption=pop(it,it_end); QString action=pop(it,it_end); QString accel=pop(it,it_end); QString icon=pop(it,it_end); QStringList classes; for(;it!=it_end;++it) {  classes+=*it; } addItem(parent,name,caption,action,accel,icon,classes);}/** Return item text for given menu item Will translate the text @param caption Caption of the menu item @param name Name if the menu item @return localized item text*/QString MenuTool::menuItemText(const QString &caption,const QString &name) { QString captionTr; if (name.isNull()) {  captionTr=Settings::trUtf8(caption.toUtf8()); } else {  captionTr=Settings::trUtf8(caption.toUtf8(),name.toUtf8()); } itemText.insert(name,caption); return captionTr;}/** Add menu item specified by given data to parent @param parent parent menu in which this item will be appended @param name Name of the item. Key in settings, or specified from script. Have to be unique @param caption Caption of item (untranslated) @param action Script to execute when the item is selected @param accel Keyboard Accelerator @param icon Name of icon @param classes Item classes @return ID of item just added*/QAction* MenuTool::addItem(QMenu *parent,const QString &name,const QString &caption,const QString &action,const QString &accel/*=QString::null*/,const QString &icon/*=QString::null*/,const QStringList &classes/*=QStringList()*/) throw (InvalidMenuException) { QString captionTr=menuItemText(caption,name); accelText.insert(name,accel); char accelChar=getAccel(captionTr); if (accelChar) {  //Some accelerator specified for item  QString s=mAccel[parent];  if (s.isNull()) s="";  if (s.indexOf(accelChar)>=0) {   //Already used   warn("Accelerator for " + caption + " is already used elsewhere!");  } else {   //Not yet used   s=s+accelChar;   mAccel[parent]=s;  } } assert(mainWindow); MenuAction *itemId=new MenuAction(captionTr,parent);//mainWindow); setAction(itemId,action); if (!accel.isNull() && accel.length()>0) { //accelerator specified  if (reserveAccel(accel,action)) {   itemId->setShortcut(QKeySequence(accel));  } } QObject::connect(itemId,SIGNAL(triggered(QAction*)),this,SLOT(menuActivated(QAction*))); QObject::connect(itemId,SIGNAL(helpText(const QString &)),this,SLOT(receiveHelpText(const QString &))); if (!icon.isNull() && icon.length()>0) { //menu icon specified  itemIcon.insert(name,icon);  const QIcon *iconSet=getIconSet(icon);  if (iconSet) itemId->setIcon(*iconSet); } parent->addAction(itemId); addToMap(name,parent,itemId); if (classes.count()) { //Extra data - Item classes  for (QStringList::ConstIterator it=classes.begin();it!=classes.end();++it) {   addToMap("/"+*it,parent,itemId);  } } return itemId;}/** Loads menubar from configuration bar, and return it<br> If menubar can't be loaded, InvalidMenuException will be thrown Missing menu icons are allowed (if it can't be loaded, there will be no icon), missing items in configuration are not.<br> @param parent QWidget that will contain the menubar @return loaded and initialized menubar*/QMenuBar* MenuTool::loadMenu(QWidget *parent) throw (InvalidMenuException) { QMainWindow *p_main=dynamic_cast<QMainWindow *>(parent); if (p_main) {  menubar=p_main->menuBar(); } else {  //menubar can't be cached and must be separate for each window (otherwise weird things happen)  menubar=new QMenuBar(parent);//Make new menubar } loadItems(QString("MainMenu"),menubar);//create root menu return menubar;}/** Add accelerator to list of used accelerators and return true, if the accelerator was not taken before. Ensure only one item uses the accelerator at time @param accelDef Accelerator in string form @param action Action to reserve for this accelerator @return true if accelerator was not in list before, false otherwise*/bool MenuTool::reserveAccel(const QString &accelDef,const QString &action) { if (accels.contains(accelDef)) {  if (accels[accelDef]!=action) {   warn("Attempt to redefine accel " + accelDef + " from '" + accels[accelDef] + "' to '" + action + "'");  }  return false; } accels[accelDef]=action; return true;}/** Try to remove command string from line. Return true, if command was found and removed from line, false if command was not found (and line is unchanged) @param line input line @param command Command to look for @return presence of command in line*/bool MenuTool::chopCommand(QString &line, const QString &command) { if (!line.startsWith(command+" ")) return false; line=line.remove(0,command.length()+1); return true;}/** Virtual function to create special item given its name @param tb toolbar in which the item is inserted @param item name of the item @param mainWindow main application window Default implementation just returns NULL*/QWidget* MenuTool::specialItem(ToolBar *tb,const QString &item,QMainWindow *mainWindow) { return NULL;}/** Load single toolbar item and add it to toolbar @param tb Toolbar for addition of item @param item Item name in configuration file*/void MenuTool::loadToolBarItem(ToolBar *tb,const QString &item) throw (InvalidMenuException) { //Check for special item if (item=="-" || item=="") {  tb->addSeparator();  return; } QWidget *spec_tb=specialItem(tb,item,mainWindow); if (spec_tb) {  //special toolbar buttons are added to list with their full parameters  addToMap(item,spec_tb);  return; } QString line=readItem(item); if (chopCommand(line,"item")) { //Format: Tooltip, Action,[,accelerator, [,icon]]  QStringList qs=explode(MENUDEF_SEPARATOR,line,true);  if (qs.count()<4) invalidItem(QObject::tr("toolbar item"),item,line,QObject::tr("4 parameters in item definition"));  QStringList::ConstIterator it=qs.begin();  QStringList::ConstIterator it_end=qs.end();  QString caption=pop(it,it_end);  QString action=pop(it,it_end);  QString accel=pop(it,it_end);  QString icon=pop(it,it_end);  QStringList classes;  for(;it!=it_end;++it) {   classes+=*it;  }  createToolBarItem(tb,item,caption,action,accel,icon,classes); } else if (chopCommand(line,"label")) { //Format: Text  if (!line.length()) invalidItem(QObject::tr("label item"),item,line);  new QLabel(Settings::trUtf8(line.toUtf8(),item.toUtf8()),tb); } else {  invalidItem(QObject::tr("toolbar item"),item,line); }}/** Return tooltip text for given text Will translate the tooltip, remove any & characters that have meaning in menus and add accelerator if specified @param text Tooltip text @param name Name of the toolbar item for which the text is. Used for correctly determining possible translation @param accel Accelerator specified for the item (or QString::null if none defined or unknown) @return localized tooltip text*/QString MenuTool::toolTipText(const QString &text,const QString &name,QString accel/*=QString::null*/) { if (accel.isNull() && accelText.contains(name)) accel=accelText[name]; itemText.insert(name,text); QString tooltip=Settings::trUtf8(text.toUtf8(),name.toUtf8()); tooltip=tooltip.replace("&",""); if (!accel.isNull() && accel.length()>0) { //accelerator specified  tooltip+=" ("+accel+")"; } accelText.insert(name,accel); return tooltip;}/** Create single toolbar button and add it to toolbar @param tb Toolbar for addition of item @param name Name of the item. Key in settings, or specified from script. Have to be unique @param text Tooltip of item (untranslated) @param action Script to execute when the item is selected @param accel Keyboard Accelerator @param icon Name of icon @param classes Item classes @return pointer to toolbutton just added*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -