【Qt】表を作る2
表を見た目を何となく作ることができました。
やりたいこと
- 表に値を入れる
- 値を変更をする
完成は一番下にあります。
表に値を入れる
まず、値を入れる方法は簡単でした。
ui->tableWidget->setItem(0,0,new QTableWidgetItem("0"));
行列(0,0)の項目に0という文字を入れていきます。
こんな感じになりました。
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"));
上記のように設定すると、表っぽくなりました。
上のソースをもっときれいにしていきます。
# 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);
}
}
完成
ボタンを押す前
ボタンを押した後
Dittoはメタモンの英語名らしい……(ぐぐった)
眠い……UI画面で、えっっボタンどこ???と言いながらpushbuttonを数十秒探してしまったピカチュウ。
眠いときにやるんじゃないなあああ