土曜日, 11月 11, 2023

Qt: 外部プログラムを起動する

 

Qt/C++ のアプリは、外部へ直接アクセスできます。これはネットアプリでは不可能な Qt のメリットです。

外部プログラムを起動することもできます。QProcess::startDetached() を使うと独立したプロセスを立ち上げることができます。

この QProcess::startDetached が Qt5.10 から使用方法がアップデートされたようなので、ご報告まで。引数は外部プログラムへのパスではなく、プロセスIDをとります。

外部プログラムは QProcess::setProgram() で設定します。

QString url = "...";
QStringList opt;
opt << url;
QProcess process;
process.setProgram(m_config.browser());
process.setArguments(opt);
process.setStandardOutputFile(QProcess::nullDevice());
process.setStandardErrorFile(QProcess::nullDevice());
qint64 pid;
if (!process.startDetached(&pid)) {
qCritical() << "Cannot start program";
}

金曜日, 11月 10, 2023

QTreeWidget アイテムの追加・削除

 

QTreeWidget はそのまま使えるツリー構造用のコンポーネントです。そのまま、というのは QTreeView 派生クラスなど作らなくても備え付けのデータクラスが使えるという意味です。

QTreeWidget へアイテムを追加するコードはヘルプにもありますが、ここではルート要素へも追加できるコードを置いておきます。


void MainWindow::addItem() {
bool ok;
QString text = QInputDialog::getText(this, tr("New Item"), tr("New Item:"),
QLineEdit::Normal, "", &ok);
if (ok && !text.isEmpty()) {
if (m_pItem == nullptr) {
QStringList lst = {text};
QTreeWidgetItem *item =
new QTreeWidgetItem(static_cast<QTreeWidget *>(nullptr), lst);
ui->treeWidget->addTopLevelItem(item);
} else {
QTreeWidgetItem *newItem = new QTreeWidgetItem(m_pItem);
newItem->setText(0, text);
m_pItem->setExpanded(true);
}
}
}


アイテムを削除する方法はこちらです。ルート要素の削除もできます。

void MainWindow::deleteItem() {
QList<QTreeWidgetItem *> items = ui->treeWidget->selectedItems();
QTreeWidgetItem *pp = nullptr;
if (!items.isEmpty()) {
foreach (QTreeWidgetItem *item, items) {
pp = item->parent();
if (pp != nullptr) {
pp->removeChild(item);
}
delete item;
}
}
}

水曜日, 11月 08, 2023

QTableWidget: ヘッダーのフォントをボールド化する

 

QTableWidget のヘッダーを設定し、フォントをボールド化する方法です。

QTableWidget のヘッダーは setHorizontalHeaderLabels() を呼び出し QStringList を渡すことで設定できます。

設定後、フォントを取得し、setBold() でボールドを設定します。


QStringList header;
header << "Number" << "Indonesian";
ui->QTableWidget->setHorizontalHeaderLabels(header);
for (int i = 0; i < header.length(); i++) {
QFont font = ui->tableWidget->horizontalHeaderItem(i)->font();
font.setBold(true);
ui->tableWidget->horizontalHeaderItem(i)->setFont(font);
}

QTableWidget で右クリックメニュー(コンテキストメニュー)

 

QTableWidget で右クリックメニューを出す方法です。

まずQTableWidget でコンテキストメニューを有効化する必要があります。

ui->tableWidget->setContextMenuPolicy(Qt::CustomContextMenu);
connect(ui->tableWidget, &QTableWidget::customContextMenuRequested, this,
&MainWindow::deleteState);


呼び出したメソッドでメニューを作り、popup() メソッドで表示します。

void MainWindow::deleteState(const QPoint &pos) {
QMenu *menu = new QMenu(this);
QAction *ciz = new QAction("&Delete State");
connect(ciz, &QAction::triggered, this, &MainWindow::deleteStateItem);
menu->addAction(ciz);
menu->popup(ui->tableWidget->viewport()->mapToGlobal(pos));
int row = ui->tableWidget->itemAt(pos)->row();
m_currentState = ui->tableWidget->item(row, 0)->text().toInt();
}

アクションを設定し、実行したいメソッドを connect() で設定します。

セルの位置はマウスクリックの位置から itemAt() で計算します。

位置情報はクラス変数で保存すると使いやすいかもしれません。

あと、QTableWidgetItem が設定されていないセルではメニューを表示しない設定もできます。

void MainWindow::deleteNumber(const QPoint &pos)
{
QTableWidgetItem* item=ui->tabWidget->itemAt(pos);
if(item!=nullptr){
QMenu *menu = new QMenu(this);
QAction *action = new QAction("&Delete Number");
connect(action, &QAction::triggered, this, &MainWindow::deleteItem);
menu->addAction(action);
menu->popup(ui->tabWidget->viewport()->mapToGlobal(pos));
int row = item->row();
m_current = ui->tabWidget->item(row, 0)->text().toInt();
}
}

Qt: 外部プログラムを起動する

  Qt/C++ のアプリは、外部へ直接アクセスできます。これはネットアプリでは不可能な Qt のメリットです。 外部プログラムを起動することもできます。QProcess::startDetached() を使うと独立したプロセスを立ち上げることができます。 この QProces...