Qt Gui使用(二)

本文介绍了如何在Qt中使用QToolBar和QAction创建工具栏,实现QTreeView的添加、遍历和删除操作,以及自定义指针到QVariant的转换。此外,还详细讲解了使用QDomDocument进行XML文件的读写操作,包括处理编译错误的方法。
1、Qt 工具栏(QToolBarQAction)添加:
     在.h文件中定义变量:
    private:
        QToolBar*        m_pToolBar;
        QAction*          m_pExitAct;
     在.cpp文件中依次做如下处理:      
        //“:/images/close.png”为“工程上 右键 > 添加新文件 > Qt资源文件”
        m_pExitAct = new QAction(QIcon(":/images/close.png"), tr("&Exit"), this);     
        m_pExitAct->setShortcuts(QKeySequence::New);
        m_pExitAct->setStatusTip(tr("Create a new file"));
        connect(m_pExitAct, SIGNAL(triggered()), this, SLOT(close()));

        m_pToolBar = new QToolBar("ToolBar", this);
        m_pToolBar->addAction(m_pExitAct);
        this->addToolBar(m_pToolBar);
        m_pToolBar->setToolButtonStyle(Qt::ToolButtonIconOnly);


2、Qt两个窗口间发送信号(signalsslots),参看Qt4.7.4 customtypesending 示例。


3、QTreeView添加Item:
        QAbstractItemModel* pPageCtrlTIM = new QAbstractItemModel(ui->PageTreeV);
        QStandardItem* pItem = new QStandardItem(m_IconMap["Floder"], "W1");
        pPageCtrlTIM->appendRow(pItem);
        QStandardItem* pItemDetail = new QStandardItem("W1说明");
        pPageCtrlTIM->setItem(pItemModel->indexFromItem(pItem).row(), 1, pItemDetail);
        QStandardItem* pChild = new QStandardItem(m_IconMap["Page"], "W11");
        pItem->setChild(0, pChild);
        pChild = new QStandardItem(m_IconMap["Page"], "W12");
        pItem->setChild(1, pChild);

        pItem = new QStandardItem(m_IconMap["Floder"], "W2");
        pPageCtrlTIM->appendRow(pItem);
        pItemDetail = new QStandardItem("W2说明");
        pPageCtrlTIM->setItem(pItemModel->indexFromItem(pItem).row(), 1, pItemDetail);
        ui->PageTreeV->setModel(pPageCtrlTIM);


4、QTreeView遍历:
        QTreeWidget *PageTreeW;

        int iItemCount = ui->PageTreeW->topLevelItemCount();
        for(int i = 0; i < iItemCount; i++)
        {
            QTreeWidgetItem* pItem = ui->PageTreeW->topLevelItem(i);
            if(NULL == pItem) continue;
            int iChildCount = pItem->childCount();
            for(int i = 0; i < iChildCount; i++)
            {
                QTreeWidgetItem* pChildItem = pItem->child(i);
            }
        }

5、QTreeView节点删除:
        QTreeWidgetItem* pParItem = pCurPageItem->parent();
        if(NULL == pParItem)        //父节点为根节点
        {
                pCurPageItem->takeChildren();
                ui->PageTreeW->takeTopLevelItem(ui->PageTreeW->indexOfTopLevelItem(pCurPageItem));
        }
        else
        {
                pParItem->removeChild(pCurPageItem);
                ui->PageTreeW->setCurrentItem(pParItem);
        }

6、自定义指针转QVariant 
    //.h自定义头文件中
    class QPageCfgInfo
    {
    public:
        explicit QPageCfgInfo();
    };
    Q_DECLARE_METATYPE(QPageCfgInfo*)
  
        //引用自定义头文件的cpp中
        QPageCfgInfo* pPageCfg = new QPageCfgInfo();
        if(NULL == pPageCfg) return false;
        pNewPageItem = new QTreeWidgetItem(ui->PageTreeW, QStringList(pPageCfg->GetPageName()));
        if(NULL == pNewPageItem){delete pPageCfg;pPageCfg = NULL;return false;}
        pNewPageItem->setFlags(pNewPageItem->flags() | Qt::ItemIsEditable);
        pNewPageItem->setIcon(0, m_IconMap["Page"]);
        pNewPageItem->setData(0, PageTreeRole, QVariant::fromValue(pPageCfg));

        void QPageTreeWidget::PageTreeItemChanged(QTreeWidgetItem *pItem, int iColumn)
        {
            if((NULL == pItem) || (0 > iColumn))
             {
                 return;
             }
             QVariant varData = pItem->data(0, PageTreeRole);
             QPageCfgInfo* pPageCfg = varData.value<QPageCfgInfo*>();
             if(NULL == pPageCfg) return;
             if(pItem->text(0) != pPageCfg->GetPageName())
             {
                 pPageCfg->SetPageName(pItem->text(0));
             }
         }

7、使用QDomDocument自定义xml文件的读写类,构建不通过,报如下错误:
        .cpp:5: undefined reference to `_imp___ZN12QDomDocumentC1Ev'
        .cpp:5: undefined reference to `_imp___ZN12QDomDocumentC1Ev'
        .cpp:11: undefined reference to `_imp___ZN25QDomProcessingInstructionC1Ev'
        .cpp:12: undefined reference to `_imp___ZN12QDomDocument27createProcessingInstructionERK7QStringS2_'
        .cpp:12: undefined reference to `_imp___ZN25QDomProcessingInstructionaSERKS_'
        .cpp:13: undefined reference to `_imp___ZN8QDomNode11appendChildERKS_'
        .cpp:13: undefined reference to `_imp___ZN8QDomNodeD1Ev'
        .cpp:15: undefined reference to `_imp___ZN12QDomDocument13createElementERK7QString'
        .cpp:16: undefined reference to `_imp___ZN8QDomNode11appendChildERKS_'
        .cpp:16: undefined reference to `_imp___ZN8QDomNodeD1Ev'
        .cpp:23: undefined reference to `_imp___ZNK8QDomNode6isNullEv'
        .cpp:25: undefined reference to `_imp___ZN11QDomElementC1ERKS_'
        添加各种头文件,即使将自定义类继承子QObject仍编译不通过,修改方法为:
        打开.pro工程文件,将:
                QT       += core gui
        修改为:
                QT       += core gui \
                                        xml


8、使用QDomDocument方式写xml文件:
        QDomDocument docItem;
        QDomProcessingInstruction myProcInstruct;
        myProcInstruct = docItem.createProcessingInstruction(tr("xml"), tr("version=\"1.0\" encoding=\"UTF-8\""));
        docItem.appendChild(myProcInstruct);
        QDomElement xmlItemRoot = docItem.createElement("PageItems");
        docItem.appendChild(xmlItemRoot);

        QDomElement xmlItem = docItem.createElement("Item");
        xmlItemParent.appendChild(xmlItem);
        xmlItem.setAttribute(tr("iType"), 5);
        xmlItem.setAttribute(tr("iStartX"), 0);
        xmlItem.setAttribute(tr("iStartY"), 0);
        xmlItem.setAttribute(tr("iStopX"), 100);
        xmlItem.setAttribute(tr("iStopY"), 100);

        QString sItemXml = QApplication::applicationDirPath() + "/CreGuiCreator/Pages/page1.xml";
        QFile fileItemXml(sItemXml);
        if(!fileItemXml.open(QIODevice::WriteOnly | QIODevice::Truncate))
        {
                return false;
        }
        QTextStream xmlOut(&fileItemXml);
        xmlOut.setCodec("UTF-8");
        docItem.save(xmlOut, 4);


8、使用QDomDocument方式 读xml文件:
        QString sItemXml = QApplication::applicationDirPath() + "/CreGuiCreator/Pages/page1 .xml";
        QFile fileItemXml(sItemXml);
        QDomDocument docItem;
        if(!fileItemXml.open(QIODevice::ReadOnly | QIODevice::Text))
        {
                return;
        }
        if(!docItem.setContent(&fileItemXml, false))
        {
                return;
        }
        QDomElement xmlItemRoot = docItem.documentElement();
        if(tr("PageItems") != xmlItemRoot.tagName())
        {
               return;
        }
        QDomElement xmlItem = xmlItemRoot.firstChildElement(tr("Item"));
        while(!xmlItem.isNull())
        {
                int iType = xmlItem.attribute(tr("iType")).toInt();
                int iStartX = xmlItem.attribute(tr("iStartX")).toDouble();
                int iStartY = xmlItem.attribute(tr("iStartY")).toDouble();
                int iStopX = xmlItem.attribute(tr("iStopX")).toDouble();
                int iStopY = xmlItem.attribute(tr("iStopY")).toDouble();

                xmlItem = xmlItem.nextSiblingElement("Item");
        }
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值