Programming memo

プログラミング備忘録

【Qt】表を作る2

表を見た目を何となく作ることができました。

shinopikapi.hateblo.jp

 

やりたいこと

  • 表に値を入れる
  • 値を変更をする

完成は一番下にあります。

 

 

表に値を入れる 

まず、値を入れる方法は簡単でした。

ui->tableWidget->setItem(0,0,new QTableWidgetItem("0"));

行列(0,0)の項目に0という文字を入れていきます。

 こんな感じになりました。

f:id:shinopikapi:20180602153825p:plain

 

    ui->tableWidget->setItem(0,0,new QTableWidgetItem("025"));
    ui->tableWidget->setItem(0,1,new QTableWidgetItem("Pikachu"));
    ui->tableWidget->setItem(0,2,new QTableWidgetItem("Electric"));
 
    ui->tableWidget->setItem(1,0,new QTableWidgetItem("026"));
    ui->tableWidget->setItem(1,1,new QTableWidgetItem("Raikchu"));
    ui->tableWidget->setItem(1,2,new QTableWidgetItem("Electric"));
 
    ui->tableWidget->setItem(2,0,new QTableWidgetItem("132"));
    ui->tableWidget->setItem(2,1,new QTableWidgetItem("Ditto"));
    ui->tableWidget->setItem(2,2,new QTableWidgetItem("Normal"));

上記のように設定すると、表っぽくなりました。

f:id:shinopikapi:20180602235319p:plain

 

上のソースをもっときれいにしていきます。

 # pika.h

struct Pokemon{
    QString No;
    QString Name;
    QString Types;
};

 

# pika.cpp

struct Pokemon pokem[3] ={
    {"025","Pikachu","Electric"},
    {"026","Raichu","Electric"},
    {"132","Ditto","Normal"},
};

 

// コンストラクタかどこか、表示させたい箇所に以下

    int len = sizeof(pokem)/(sizeof(Pokemon));
    for(int i=0;i<len;i++){
        ui->tableWidget->setItem(i,0,new QTableWidgetItem(pokem[i].No));
        ui->tableWidget->setItem(i,1,new QTableWidgetItem(pokem[i].Name));
        ui->tableWidget->setItem(i,2,new QTableWidgetItem(pokem[i].Types));
    }

上記のlenでは、構造体の要素数を取得しています。

要素数はとりあえず3としましたが、実際どんどん増やしていく場合は固定にしないと思うので、取得するようにした方が後々いいと思います。

 

もっと短く書く方法はあると思いますが、眠いのでもはやこれまで……( ^ω^)

上記に修正しても結果は↑の表と同じです。

 

値を変更

コンストラクタでnewをしているのですが、

後々書き替えたいときは、pika.h(ヘッダファイル)にクラスでもっておきます。

毎回newしても変えられるのはやってみてわかりましたが、ずっとnew......かあと思いました。

 

# pika.h

QTableWidgetItem *twi[3];

 

# pika.cpp

コンストラクタを修正します。

 
    int len = sizeof(pokem)/(sizeof(Pokemon));
    for(int i=0;i<len;i++){
        ui->tableWidget->setItem(i,0,new QTableWidgetItem(pokem[i].No));
        twi[i] = new QTableWidgetItem(pokem[i].Name);
        ui->tableWidget->setItem(i,1,twi[i]);
        ui->tableWidget->setItem(i,2,new QTableWidgetItem(pokem[i].Types));
    }

 

同じ型の構造体でpokemJを作ります。

pokemJはpokem同様、コンストラクタではないところに書きます。

struct Pokemon pokemJ[3] ={
    {"025","Pikachu","Electric"},
    {"026","Raichu","Electric"},
    {"132","Metamon","Normal"},
};

 

ボタンを作成、押されたらpokemJの方のNameに変わるようにします。

void Pika::on_pushButton_clicked()
{
 
    int len = sizeof(pokemJ)/(sizeof(Pokemon));
 
    for(int i=0;i<len;i++){
        QVariant test(pokemJ[i].Name);
        twi[i]->setData(Qt::DisplayRole,test);
    }
}

 

完成

ボタンを押す前

f:id:shinopikapi:20180603015621p:plain

ボタンを押した後

f:id:shinopikapi:20180603015635p:plain

Dittoはメタモンの英語名らしい……(ぐぐった)

 

 

眠い……UI画面で、えっっボタンどこ???と言いながらpushbuttonを数十秒探してしまったピカチュウ。

眠いときにやるんじゃないなあああ