std::map

啊哈哈小叮当 2016-06-06 01:39:18

要实现的功能是:在参数设置控件的tablewidget里输入内容,点击保存按钮,在参数控件的tablewidget里对应显示内容。
写在一个类里,我已经实现了,但是要写在两个类里,还要用到std::map<std::string, std::string>就不知道怎么写了,
求大神指点!一下是三个要用到的自定义函数:

//其实真正不懂的是这三个函数的参数怎么用
void InitParameter(std::map<std::string, std::string>& mapPara); //初始化参数
void UpdateParameter(std::map<std::string, std::string>& mapPara); //更新参数
void GetLstParameter(std::map<std::string, std::string>& mapPara); //获取参数

private slots:
void SaveParameter(); //保存参数

参数设置控件类:
STControlPageUI::STControlPageUI(QWidget *parent, IStrategyComponent* pStComponent)
: QWidget(parent)

参数控件类:
ParameterSetDilog::ParameterSetDilog(QWidget *parent)
...全文
1368 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
啊哈哈小叮当 2016-06-14
  • 打赏
  • 举报
回复

std::map<std::string, std::string>::iterator it;
        int row=0;
        for(it=mapPara.begin();it!=mapPara.end();it++)
        {
            QString  str1=QString::fromStdString(it->first);
            QString  str2=QString::fromStdString(it->second);
            _tableWidget->setItem(row,0,new QTableWidgetItem(str1));
            _tableWidget->setItem(row,1,new QTableWidgetItem(str2));
            row++;
        }
终于可以了!谢谢大神的帮助!
赵4老师 2016-06-13
  • 打赏
  • 举报
回复
仅供参考:
#pragma warning(disable:4786)
#include <iostream>
#include <string>
#include <map>
using namespace std;
int main () {
    wstring ws1,ws2;

    wcin.imbue(locale("chs"));
    wcout.imbue(locale("chs"));
    getline(wcin,ws1);
    getline(wcin,ws2);
    if (ws1.size()!=ws2.size()) {
        wcout<<ws1<<L" 和 "<<ws2<<L" 不对应"<<endl;
        return 1;
    }

    map<wchar_t,wchar_t> m1,m2;
    int n=ws1.size();

    for (int i=0;i<n;i++) {
        if (m1.find(ws1[i])==m1.end() && m2.find(ws2[i])==m2.end()) {
            m1[ws1[i]]=ws2[i];
            m2[ws2[i]]=ws1[i];
        } else {
            if (m1[ws1[i]]!=ws2[i] || m2[ws2[i]]!=ws1[i]) {
                wcout<<ws1<<L" 和 "<<ws2<<L" 不对应"<<endl;
                return 1;
            }
        }
    }
    wcout<<ws1<<L" 和 "<<ws2<<L" 对应"<<endl;
    return 0;
}
啊哈哈小叮当 2016-06-13
  • 打赏
  • 举报
回复
直接报错! 是不是需要it=mapPara.find(参数);
小灸舞 2016-06-13
  • 打赏
  • 举报
回复
你在上面加个打印吧,看看值对不对 qDebug() << row_number << it->first << it->second;
啊哈哈小叮当 2016-06-13
  • 打赏
  • 举报
回复
编译没错,运行起来会蹦掉,是不是指针使用的问题,哪里需要判空?
调试的时候是这两句有错:
_tableWidget->item(row_number, 0)->setText(QString::fromStdString(it->fist));
_tableWidget->item(row_number, 1)->setText( QString::fromStdString(it->second));
啊哈哈小叮当 2016-06-13
  • 打赏
  • 举报
回复
上面两句是有错误的,it->first 和it->second
啊哈哈小叮当 2016-06-13
  • 打赏
  • 举报
回复
c:\work\build\qt5_workdir\w\s\qtbase\src\widgets\itemviews\qtablewidget.h:181: error: Exception at 0x654a2113, code: 0xc0000005: read access violation at: 0x0, flags=0x0 (first chance)
啊哈哈小叮当 2016-06-13
  • 打赏
  • 举报
回复
it->first和it->second无法识别
小灸舞 2016-06-07
  • 打赏
  • 举报
回复
将你参数设置的这个tablewidget每行的参数名以及值一对对的放到map里,然后将mapPara传到另一个tabwidget就行了

std::map<std::string, std::string> mapPara;
for(int i = 0; i < ui->tableWidget_para_set->rowCount(); i++)
{
string name = ui->tableWidget_para_set->item(i, 0)->text().toStdString();
string value = ui->tableWidget_para_set->item(i, 1)->text().toStdString();
mapPara[name] = value;
}
啊哈哈小叮当 2016-06-07
  • 打赏
  • 举报
回复
说点重点的,怎么从tablewidget里面获取内容,再加入到另一个tablewidget里面? 前提时要用到std::map,不用这个的话我会做。
啊哈哈小叮当 2016-06-07
  • 打赏
  • 举报
回复
大神就不要嘲笑我了,我连map都不懂,就别和我说其他的了
小灸舞 2016-06-07
  • 打赏
  • 举报
回复
转一下呗。。。。
_tableWidget->item(row_number, 0)->setText(QString::fromStdString(it->fist));
_tableWidget->item(row_number, 1)->setText( QString::fromStdString(it->second));
啊哈哈小叮当 2016-06-07
  • 打赏
  • 举报
回复
error: C2664: “void QTableWidgetItem::setText(const QString &)”: 无法将参数 1 从“const std::string”转换为“const QString &” 原因如下: 无法从“const std::string”转换为“const QString” 没有可用于执行该转换的用户定义的转换运算符,或者无法调用该运算符
小灸舞 2016-06-07
  • 打赏
  • 举报
回复
如果你的_tableWidget本来就已经建好了行和列那么像下面那样就行。
如果没建的话,需要先insertRow,然后setItem才行

std::map<std::string, std::string>::iterator it;
int row_number = 0;
for(it=mapPara.begin();it!=mapPara.end();it++)
{
_tableWidget->item(row_number, 0)->setText(it->fist);
_tableWidget->item(row_number, 1)->setText(it->second);
row_number++;
}
啊哈哈小叮当 2016-06-07
  • 打赏
  • 举报
回复

void STControlPageUI::SetParameter(std::map<std::string, std::string> &mapPara)
{
    std::map<std::string, std::string>::iterator it;
    for(it=mapPara.begin();it!=mapPara.end();it++)
    {
        _tableWidget->setItem(。。。);//这样添加不行
    }
}
还是要麻烦大神! 怎么读到tablewidget里面?
小灸舞 2016-06-07
  • 打赏
  • 举报
回复
随便你用啥方式,用全局变量都可以,你开心就好
啊哈哈小叮当 2016-06-07
  • 打赏
  • 举报
回复

void ParameterSetDilog::SaveParameter()
{
    std::map<std::string, std::string> mapPara;
    UpdateParameter(mapPara);
    this->close();
}
这样也可以吧!
啊哈哈小叮当 2016-06-07
  • 打赏
  • 举报
回复
一定要这样吗?老大给的函数不带参数啊!是他忘了写吗?
小灸舞 2016-06-07
  • 打赏
  • 举报
回复
signal和slot都带上参数不就行了?
void SaveParameter(std::map<std::string, std::string>& mapPara);
啊哈哈小叮当 2016-06-07
  • 打赏
  • 举报
回复
大神好人做到底吧!
private slots:
    void SaveParameter();
怎么将mapPara传到另一个tabwidget?
加载更多回复(5)

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧