diff options
Diffstat (limited to '')
-rw-r--r-- | include/gpg/GpgKey.h | 2 | ||||
-rw-r--r-- | include/gpg/GpgSubKey.h | 1 | ||||
-rw-r--r-- | include/ui/keypair_details/KeyPairDetailTab.h | 1 | ||||
-rw-r--r-- | include/ui/keypair_details/KeyPairSubkeyTab.h | 9 | ||||
-rw-r--r-- | include/ui/keypair_details/KeySetExpireDateDialog.h | 26 | ||||
-rw-r--r-- | src/gpg/GpgContext.cpp | 4 | ||||
-rw-r--r-- | src/gpg/GpgKey.cpp | 8 | ||||
-rw-r--r-- | src/gpg/GpgSubKey.cpp | 5 | ||||
-rw-r--r-- | src/ui/keypair_details/KeyPairDetailTab.cpp | 32 | ||||
-rw-r--r-- | src/ui/keypair_details/KeyPairSubkeyTab.cpp | 69 | ||||
-rw-r--r-- | src/ui/keypair_details/KeyPairUIDTab.cpp | 2 | ||||
-rw-r--r-- | src/ui/keypair_details/KeySetExpireDateDialog.cpp | 28 | ||||
-rw-r--r-- | src/ui/keypair_details/KeyUIDSignDialog.cpp | 2 | ||||
-rw-r--r-- | src/ui/widgets/KeyList.cpp | 34 |
14 files changed, 183 insertions, 40 deletions
diff --git a/include/gpg/GpgKey.h b/include/gpg/GpgKey.h index ec796780..f83a2a1e 100644 --- a/include/gpg/GpgKey.h +++ b/include/gpg/GpgKey.h @@ -56,6 +56,8 @@ public: bool revoked{}; bool disabled{}; + bool has_master_key{}; + bool good = false; QVector<GpgSubKey> subKeys; diff --git a/include/gpg/GpgSubKey.h b/include/gpg/GpgSubKey.h index 229e04c9..f2da9e9e 100644 --- a/include/gpg/GpgSubKey.h +++ b/include/gpg/GpgSubKey.h @@ -45,6 +45,7 @@ struct GpgSubKey { bool expired{}; bool revoked{}; bool disabled{}; + bool secret{}; bool is_cardkey{}; QDateTime timestamp; diff --git a/include/ui/keypair_details/KeyPairDetailTab.h b/include/ui/keypair_details/KeyPairDetailTab.h index 6b3bc2f0..d081ac46 100644 --- a/include/ui/keypair_details/KeyPairDetailTab.h +++ b/include/ui/keypair_details/KeyPairDetailTab.h @@ -77,6 +77,7 @@ private: QLabel *keyidVarLabel; /** Label containng the keys keyid */ QLabel *fingerPrintVarLabel; /** Label containng the keys fingerprint */ QLabel *usageVarLabel; + QLabel *masterKeyExistVarLabel; public: explicit KeyPairDetailTab(GpgME::GpgContext *ctx, const GpgKey& mKey, QWidget *parent = nullptr); diff --git a/include/ui/keypair_details/KeyPairSubkeyTab.h b/include/ui/keypair_details/KeyPairSubkeyTab.h index ae954968..41bb0648 100644 --- a/include/ui/keypair_details/KeyPairSubkeyTab.h +++ b/include/ui/keypair_details/KeyPairSubkeyTab.h @@ -29,6 +29,7 @@ #include "gpg/GpgContext.h" #include "ui/keygen/SubkeyGenerateDialog.h" +#include "KeySetExpireDateDialog.h" class KeyPairSubkeyTab : public QWidget { Q_OBJECT @@ -43,6 +44,8 @@ private: void createSubkeyOperaMenu(); + const GpgSubKey *getSelectedSubkey(); + GpgME::GpgContext *mCtx; const GpgKey &mKey; QTableWidget *subkeyList; @@ -61,6 +64,7 @@ private: QLabel *keyidVarLabel; /** Label containng the keys keyid */ QLabel *fingerPrintVarLabel; /** Label containng the keys fingerprint */ QLabel *usageVarLabel; + QLabel *masterKeyExistVarLabel; private slots: @@ -75,6 +79,11 @@ private slots: void slotRevokeSubkey(); +protected: + + void contextMenuEvent(QContextMenuEvent *event) override; + + }; diff --git a/include/ui/keypair_details/KeySetExpireDateDialog.h b/include/ui/keypair_details/KeySetExpireDateDialog.h index d0206402..118bc5ed 100644 --- a/include/ui/keypair_details/KeySetExpireDateDialog.h +++ b/include/ui/keypair_details/KeySetExpireDateDialog.h @@ -1,6 +1,26 @@ -// -// Created by eric on 2021/6/3. -// +/** + * This file is part of GPGFrontend. + * + * GPGFrontend is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Foobar is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Foobar. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from gpg4usb-team. + * Their source code version also complies with GNU General Public License. + * + * The source code version of this software was modified and released + * by Saturneric<[email protected]> starting on May 12, 2021. + * + */ #ifndef GPGFRONTEND_KEYSETEXPIREDATEDIALOG_H #define GPGFRONTEND_KEYSETEXPIREDATEDIALOG_H diff --git a/src/gpg/GpgContext.cpp b/src/gpg/GpgContext.cpp index d6211616..07e0c8fa 100644 --- a/src/gpg/GpgContext.cpp +++ b/src/gpg/GpgContext.cpp @@ -607,7 +607,7 @@ namespace GpgME { void GpgContext::checkErr(gpgme_error_t gpgmeError) { //if (gpgmeError != GPG_ERR_NO_ERROR && gpgmeError != GPG_ERR_CANCELED) { - if (gpgmeError != GPG_ERR_NO_ERROR) { + if (gpg_err_code(gpgmeError) != GPG_ERR_NO_ERROR) { qDebug() << "[Error " << gpg_err_code(gpgmeError) << "] Source: " << gpgme_strsource(gpgmeError) << " Description: " << gpgErrString(gpgmeError); } @@ -992,7 +992,7 @@ namespace GpgME { auto gpgmeError = gpgme_op_revsig(mCtx, key.key_refer, signing_key.key_refer, signature.uid.toUtf8().constData(), 0); - if(gpgmeError == GPG_ERR_NO_ERROR) { + if(gpg_err_code(gpgmeError) == GPG_ERR_NO_ERROR) { emit signalKeyUpdated(key.id); return true; } diff --git a/src/gpg/GpgKey.cpp b/src/gpg/GpgKey.cpp index bcacc8c3..df4b05ca 100644 --- a/src/gpg/GpgKey.cpp +++ b/src/gpg/GpgKey.cpp @@ -96,6 +96,7 @@ void GpgKey::parse(gpgme_key_t key) { pubkey_algo = subKeys.first().pubkey_algo; create_time = subKeys.first().timestamp; length = subKeys.first().length; + has_master_key = subKeys.first().secret; } else { id = ""; } @@ -129,6 +130,7 @@ GpgKey::GpgKey(GpgKey &&k) noexcept { expired = k.expired; revoked = k.revoked; disabled = k.disabled; + k.has_master_key = k.has_master_key; good = k.good; k.good = false; @@ -167,6 +169,8 @@ GpgKey &GpgKey::operator=(const GpgKey &k) { revoked = k.revoked; disabled = k.disabled; + has_master_key = k.has_master_key; + good = k.good; subKeys = k.subKeys; @@ -196,6 +200,8 @@ GpgKey::GpgKey(const GpgKey &k) : revoked = k.revoked; disabled = k.disabled; + has_master_key = k.has_master_key; + good = k.good; subKeys = k.subKeys; @@ -234,6 +240,8 @@ GpgKey &GpgKey::operator=(GpgKey &&k) noexcept { revoked = k.revoked; disabled = k.disabled; + has_master_key = k.has_master_key; + good = k.good; k.good = false; diff --git a/src/gpg/GpgSubKey.cpp b/src/gpg/GpgSubKey.cpp index 0f8e279f..4adda132 100644 --- a/src/gpg/GpgSubKey.cpp +++ b/src/gpg/GpgSubKey.cpp @@ -31,8 +31,9 @@ GpgSubKey::GpgSubKey(gpgme_subkey_t key) { pubkey_algo = gpgme_pubkey_algo_name(key->pubkey_algo); fpr = key->fpr; - expired = (key->expired != 0u); - revoked = (key->revoked != 0u); + expired = key->expired; + revoked = key->revoked; + secret = key->secret; disabled = key->disabled; diff --git a/src/ui/keypair_details/KeyPairDetailTab.cpp b/src/ui/keypair_details/KeyPairDetailTab.cpp index 15dfb661..5ba8d1e9 100644 --- a/src/ui/keypair_details/KeyPairDetailTab.cpp +++ b/src/ui/keypair_details/KeyPairDetailTab.cpp @@ -63,11 +63,12 @@ KeyPairDetailTab::KeyPairDetailTab(GpgME::GpgContext *ctx, const GpgKey &mKey, Q keySizeVal = QString::number(mKey.length); if (mKey.expires.toTime_t() == 0) { - keyExpireVal = tr("Never Expired"); + keyExpireVal = tr("Never Expires"); } else { keyExpireVal = mKey.expires.toString(); } + keyAlgoVal = mKey.pubkey_algo; keyCreateTimeVal = mKey.create_time.toString(); @@ -76,6 +77,28 @@ KeyPairDetailTab::KeyPairDetailTab(GpgME::GpgContext *ctx, const GpgKey &mKey, Q createdVarLabel = new QLabel(keyCreateTimeVal); algorithmVarLabel = new QLabel(keyAlgoVal); + // Show the situation that master key not exists. + masterKeyExistVarLabel = new QLabel(mKey.has_master_key ? "Exists" : "Not Exists"); + if(!mKey.has_master_key){ + auto paletteExpired = masterKeyExistVarLabel->palette(); + paletteExpired.setColor(masterKeyExistVarLabel->foregroundRole(), Qt::red); + masterKeyExistVarLabel->setPalette(paletteExpired); + } else { + auto paletteValid = masterKeyExistVarLabel->palette(); + paletteValid.setColor(masterKeyExistVarLabel->foregroundRole(), Qt::darkGreen); + masterKeyExistVarLabel->setPalette(paletteValid); + } + + if(mKey.expired){ + auto paletteExpired = expireVarLabel->palette(); + paletteExpired.setColor(expireVarLabel->foregroundRole(), Qt::red); + expireVarLabel->setPalette(paletteExpired); + } else { + auto paletteValid = expireVarLabel->palette(); + paletteValid.setColor(expireVarLabel->foregroundRole(), Qt::darkGreen); + expireVarLabel->setPalette(paletteValid); + } + auto *mvbox = new QVBoxLayout(); auto *vboxKD = new QGridLayout(); auto *vboxOD = new QGridLayout(); @@ -93,6 +116,7 @@ KeyPairDetailTab::KeyPairDetailTab(GpgME::GpgContext *ctx, const GpgKey &mKey, Q vboxKD->addWidget(new QLabel(tr("Usage: ")), 3, 0); vboxKD->addWidget(new QLabel(tr("Expires on: ")), 4, 0); vboxKD->addWidget(new QLabel(tr("Last Update: ")), 5, 0); + vboxKD->addWidget(new QLabel(tr("Existence: ")), 6, 0); vboxKD->addWidget(keySizeVarLabel, 2, 1); @@ -101,6 +125,7 @@ KeyPairDetailTab::KeyPairDetailTab(GpgME::GpgContext *ctx, const GpgKey &mKey, Q vboxKD->addWidget(createdVarLabel, 5, 1); vboxKD->addWidget(keyidVarLabel, 0, 1); vboxKD->addWidget(usageVarLabel, 3, 1); + vboxKD->addWidget(masterKeyExistVarLabel, 6, 1); ownerBox->setLayout(vboxOD); mvbox->addWidget(ownerBox); @@ -151,16 +176,17 @@ KeyPairDetailTab::KeyPairDetailTab(GpgME::GpgContext *ctx, const GpgKey &mKey, Q auto *expLabel = new QLabel(); auto *iconLabel = new QLabel(); if (mKey.expired) { - expLabel->setText(tr("Warning: Key expired")); + expLabel->setText(tr("Warning: The master key of the key pair has expired.")); } if (mKey.revoked) { - expLabel->setText(tr("Warning: Key revoked")); + expLabel->setText(tr("Warning: The master key of the key pair has been revoked")); } iconLabel->setPixmap(pixmap); QFont font = expLabel->font(); font.setBold(true); expLabel->setFont(font); + expLabel->setAlignment(Qt::AlignCenter); expBox->addWidget(iconLabel); expBox->addWidget(expLabel); mvbox->addLayout(expBox); diff --git a/src/ui/keypair_details/KeyPairSubkeyTab.cpp b/src/ui/keypair_details/KeyPairSubkeyTab.cpp index 75bd50f5..b47013ed 100644 --- a/src/ui/keypair_details/KeyPairSubkeyTab.cpp +++ b/src/ui/keypair_details/KeyPairSubkeyTab.cpp @@ -27,6 +27,7 @@ KeyPairSubkeyTab::KeyPairSubkeyTab(GpgME::GpgContext *ctx, const GpgKey &key, QWidget *parent) : mCtx(ctx), mKey(key), QWidget(parent) { createSubkeyList(); + createSubkeyOperaMenu(); listBox = new QGroupBox("Subkey List"); detailBox = new QGroupBox("Detail of Selected Subkey"); @@ -55,6 +56,7 @@ KeyPairSubkeyTab::KeyPairSubkeyTab(GpgME::GpgContext *ctx, const GpgKey &key, QW subkeyDetailLayout->addWidget(new QLabel(tr("Usage: ")), 3, 0); subkeyDetailLayout->addWidget(new QLabel(tr("Expires on: ")), 4, 0); subkeyDetailLayout->addWidget(new QLabel(tr("Last Update: ")), 5, 0); + subkeyDetailLayout->addWidget(new QLabel(tr("Existence: ")), 6, 0); keyidVarLabel = new QLabel(); keySizeVarLabel = new QLabel(); @@ -62,6 +64,7 @@ KeyPairSubkeyTab::KeyPairSubkeyTab(GpgME::GpgContext *ctx, const GpgKey &key, QW algorithmVarLabel = new QLabel(); createdVarLabel = new QLabel(); usageVarLabel = new QLabel(); + masterKeyExistVarLabel = new QLabel(); subkeyDetailLayout->addWidget(keyidVarLabel, 0, 1); subkeyDetailLayout->addWidget(keySizeVarLabel, 2, 1); @@ -69,6 +72,7 @@ KeyPairSubkeyTab::KeyPairSubkeyTab(GpgME::GpgContext *ctx, const GpgKey &key, QW subkeyDetailLayout->addWidget(algorithmVarLabel, 1, 1); subkeyDetailLayout->addWidget(createdVarLabel, 5, 1); subkeyDetailLayout->addWidget(usageVarLabel, 3, 1); + subkeyDetailLayout->addWidget(masterKeyExistVarLabel, 6, 1); listBox->setLayout(subkeyListLayout); detailBox->setLayout(subkeyDetailLayout); @@ -165,18 +169,22 @@ void KeyPairSubkeyTab::slotAddSubkey() { void KeyPairSubkeyTab::slotRefreshSubkeyDetail() { - int row = 0; - - for(int i = 0 ; i < subkeyList->rowCount(); i++) { - if(subkeyList->item(row, 0)->isSelected()) break; - row++; - } - - auto key = buffered_subkeys[row]; + auto key = getSelectedSubkey(); keyidVarLabel->setText(key->id); keySizeVarLabel->setText(QString::number(key->length)); - expireVarLabel->setText(key->expires.toTime_t() == 0 ? tr("Never Expire") : key->expires.toString()); + + expireVarLabel->setText(key->expires.toTime_t() == 0 ? tr("Never Expires") : key->expires.toString()); + if(key->expires.toTime_t() != 0 && key->expires < QDateTime::currentDateTime()) { + auto paletteExpired = expireVarLabel->palette(); + paletteExpired.setColor(expireVarLabel->foregroundRole(), Qt::red); + expireVarLabel->setPalette(paletteExpired); + } else { + auto paletteValid = expireVarLabel->palette(); + paletteValid.setColor(expireVarLabel->foregroundRole(), Qt::darkGreen); + expireVarLabel->setPalette(paletteValid); + } + algorithmVarLabel->setText(key->pubkey_algo); createdVarLabel->setText(key->timestamp.toString()); @@ -193,21 +201,56 @@ void KeyPairSubkeyTab::slotRefreshSubkeyDetail() { usage_steam << "Auth "; usageVarLabel->setText(usage); + + // Show the situation that master key not exists. + masterKeyExistVarLabel->setText(key->secret ? "Exists" : "Not Exists"); + if(!key->secret){ + auto paletteExpired = masterKeyExistVarLabel->palette(); + paletteExpired.setColor(masterKeyExistVarLabel->foregroundRole(), Qt::red); + masterKeyExistVarLabel->setPalette(paletteExpired); + } else { + auto paletteValid = masterKeyExistVarLabel->palette(); + paletteValid.setColor(masterKeyExistVarLabel->foregroundRole(), Qt::darkGreen); + masterKeyExistVarLabel->setPalette(paletteValid); + } } void KeyPairSubkeyTab::createSubkeyOperaMenu() { subkeyOperaMenu = new QMenu(); - auto *revokeSubkeyAct = new QAction(tr("Revoke Subkey")); - auto *editSubkeyAct = new QAction(tr("Edit Subkey")); + // auto *revokeSubkeyAct = new QAction(tr("Revoke Subkey")); + auto *editSubkeyAct = new QAction(tr("Edit Expire Date")); + connect(editSubkeyAct, SIGNAL(triggered(bool)), this, SLOT(slotEditSubkey())); - subkeyOperaMenu->addAction(revokeSubkeyAct); + // subkeyOperaMenu->addAction(revokeSubkeyAct); subkeyOperaMenu->addAction(editSubkeyAct); } void KeyPairSubkeyTab::slotEditSubkey() { - + auto *subkey = getSelectedSubkey(); + if(subkey == buffered_subkeys[0]) { + subkey = nullptr; + } + auto dialog = new KeySetExpireDateDialog(mCtx, mKey, subkey, this); + dialog->show(); } void KeyPairSubkeyTab::slotRevokeSubkey() { } + +void KeyPairSubkeyTab::contextMenuEvent(QContextMenuEvent *event) { + if (subkeyList->selectedItems().length() > 0) { + subkeyOperaMenu->exec(event->globalPos()); + } +} + +const GpgSubKey *KeyPairSubkeyTab::getSelectedSubkey() { + int row = 0; + + for(int i = 0 ; i < subkeyList->rowCount(); i++) { + if(subkeyList->item(row, 0)->isSelected()) break; + row++; + } + + return buffered_subkeys[row]; +} diff --git a/src/ui/keypair_details/KeyPairUIDTab.cpp b/src/ui/keypair_details/KeyPairUIDTab.cpp index 1fe57916..729fb1d2 100644 --- a/src/ui/keypair_details/KeyPairUIDTab.cpp +++ b/src/ui/keypair_details/KeyPairUIDTab.cpp @@ -209,7 +209,7 @@ void KeyPairUIDTab::slotRefreshSigList() { auto *tmp4 = new QTableWidgetItem(sig->create_time.toString()); sigList->setItem(sigRow, 3, tmp4); - auto *tmp5 = new QTableWidgetItem(sig->expire_time.toTime_t() == 0 ? tr("Never Expire") : sig->expire_time.toString()); + auto *tmp5 = new QTableWidgetItem(sig->expire_time.toTime_t() == 0 ? tr("Never Expires") : sig->expire_time.toString()); tmp5->setTextAlignment(Qt::AlignCenter); sigList->setItem(sigRow, 4, tmp5); diff --git a/src/ui/keypair_details/KeySetExpireDateDialog.cpp b/src/ui/keypair_details/KeySetExpireDateDialog.cpp index f9b05dea..67238685 100644 --- a/src/ui/keypair_details/KeySetExpireDateDialog.cpp +++ b/src/ui/keypair_details/KeySetExpireDateDialog.cpp @@ -1,6 +1,26 @@ -// -// Created by eric on 2021/6/3. -// +/** + * This file is part of GPGFrontend. + * + * GPGFrontend is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Foobar is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Foobar. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from gpg4usb-team. + * Their source code version also complies with GNU General Public License. + * + * The source code version of this software was modified and released + * by Saturneric<[email protected]> starting on May 12, 2021. + * + */ #include "ui/keypair_details/KeySetExpireDateDialog.h" @@ -9,7 +29,7 @@ QDialog(parent), mKey(key), mSubkey(subkey), mCtx(ctx) { QDateTime maxDateTime = QDateTime::currentDateTime().addYears(2); dateTimeEdit = new QDateTimeEdit(maxDateTime); - dateTimeEdit->setMinimumDateTime(QDateTime::currentDateTime()); + dateTimeEdit->setMinimumDateTime(QDateTime::currentDateTime().addSecs(1)); dateTimeEdit->setMaximumDateTime(maxDateTime); nonExpiredCheck = new QCheckBox(); nonExpiredCheck->setTristate(false); diff --git a/src/ui/keypair_details/KeyUIDSignDialog.cpp b/src/ui/keypair_details/KeyUIDSignDialog.cpp index 2fe03e26..4ccf51a1 100644 --- a/src/ui/keypair_details/KeyUIDSignDialog.cpp +++ b/src/ui/keypair_details/KeyUIDSignDialog.cpp @@ -33,7 +33,7 @@ KeyUIDSignDialog::KeyUIDSignDialog(GpgME::GpgContext *ctx, const GpgKey &key, co this); mKeyList->setFilter([](const GpgKey &key) -> bool { - if(key.disabled || !key.can_sign) return false; + if(key.disabled || !key.can_certify || !key.has_master_key || key.expired || key.revoked) return false; else return true; }); mKeyList->setExcludeKeys({key.id}); diff --git a/src/ui/widgets/KeyList.cpp b/src/ui/widgets/KeyList.cpp index 0868890f..b6596402 100644 --- a/src/ui/widgets/KeyList.cpp +++ b/src/ui/widgets/KeyList.cpp @@ -152,26 +152,25 @@ void KeyList::slotRefresh() tmp0->setCheckState(Qt::Unchecked); mKeyList->setItem(row_index, 0, tmp0); + QString type_str; + QTextStream type_steam(&type_str); if (it->is_private_key) { - auto *tmp1 = new QTableWidgetItem("pub/sec"); - mKeyList->setItem(row_index, 1, tmp1); + type_steam << "pub/sec"; } else { - auto *tmp1 = new QTableWidgetItem("pub"); - mKeyList->setItem(row_index, 1, tmp1); + type_steam << "pub"; } + if(it->is_private_key && !it->has_master_key) { + type_steam << "#"; + } + auto* tmp1 = new QTableWidgetItem(type_str); + mKeyList->setItem(row_index, 1, tmp1); + auto *tmp2 = new QTableWidgetItem(it->name); tmp2->setToolTip(it->name); mKeyList->setItem(row_index, 2, tmp2); auto *tmp3 = new QTableWidgetItem(it->email); tmp3->setToolTip(it->email); - // strike out expired keys - if(it->expired || it->revoked) { - QFont strike = tmp2->font(); - strike.setStrikeOut(true); - tmp2->setFont(strike); - tmp3->setFont(strike); - } mKeyList->setItem(row_index, 3, tmp3); QString usage; @@ -198,6 +197,19 @@ void KeyList::slotRefresh() temp_fpr->setTextAlignment(Qt::AlignCenter); mKeyList->setItem(row_index, 6, temp_fpr); + // strike out expired keys + if(it->expired || it->revoked) { + QFont strike = tmp2->font(); + strike.setStrikeOut(true); + tmp0->setFont(strike); + temp_usage->setFont(strike); + temp_fpr->setFont(strike); + temp_validity->setFont(strike); + tmp1->setFont(strike); + tmp2->setFont(strike); + tmp3->setFont(strike); + } + it++; ++row_index; } |