カンテラの光の下で

dNaga392's memorandom

【Qt】テキストファイルの行数を取得する

行数の数え上げはQTextStream::readLine()を用います。
以下は実際に読んだ行数を返す例です。

int countLine(QString filePath)
{
    int line_count=0;
    QFile file(filePath);
    file.open(QIODevice::ReadOnly); //| QIODevice::Text)
    QTextStream in(&file);
    while( !in.atEnd())
    {
        in.readLine();
        line_count++;
    }
    return line_count;
}

参考

Qt - How to count number of line in .txt file - Stack Overflow

【Qt】【QList】リストの中身を取り出す

QListの中の値を取得するにはメソッドat()やオペレーター[]を利用します。

それとは別に、QListの中の値を得て、QListから取り除くきたい。
そんなときはメソッドtakeAt()を用います。

先頭または最後に対して同様の操作をする場合は、
takeFirst(), takeLast()を用います。

以下はリストが空になるまで先頭から順に取り出す例です。

#include <QtCore>

void takeAtList()
{
    QList<QString> list;
    list << "A" << "B" << "C" << "D" << "E" << "F";
    while(list.size() > 0)
    {
        QString item = list.takeFirst();
        qDebug("%s, %d: item=[%s]", __FILE__, __LINE__, qPrintable(item));
    } // output "A", "B", "C", "D", "E", "F"
}

neobundleを導入する

neobundleが便利で自宅環境にも導入にしようとしたのですが、
思いがけないところで躓いたのでメモ。

つまずいた箇所は、

という箇所。これがないとNeoBundleInstallが失敗します。
しかもエラーメッセージなしなので、結構痛かった。

参考

【Qt】【QMessageBox】メッセージボックスからボタンを消す

メッセージボックスからボタンを消すにはメソッドsetStandardButtonsに0を渡してあげます。

QMessageBox m;
m.setStandardButtons(0);

ただ、クラスを作っても良いならQDialogを基底にQLabelを配置したダイアログを作成するのもありかも。

参考

【Vim】【Markdown】VimでMarkdownのシンタックスハイライトを使う

標準のハイライトでは*.md等のファイルはMarkdownではなく modula2 のものと判断されているらしい。

そのため、以下の記述を.vimrcに加えてあげる

autocmd BufNewFile,BufRead *.{md,mdwn,mkd,mkdn,mark*} set filetype=markdown

参考

【Qt】【QWidget】ウィジェットの画面を描画する

ウィジェットの画面を他のペイントデバイス(QPaintDeviceの派生クラス)に描画する方法です。

// QPixmapにウィジェットの表示を直接描画する方法

QWidget *w = new QWidget();

// 描画内容の設定
QLabel *lbl = new QLabel("Hello world.");
QVBoxLayout *layout = new QVBoxLayout();
layout->addWidget(lbl);
w->setLayout(layout);

// 描画先の用意
// ウィジェットと同じサイズを用意
QPixmap pix(w->size());

// ウィジェットの描画
// まず表示してウィジェットの描画イベントを走らせる
w->show();
// 描画内容を複写
w->render(&pix);
// 複写内容を保存(確認用)
pix.save("hello.png");

QWidget を表示せず描画する場合は、ウィジェットに Qt::WA_DontShowOnScreen を設定します。

// QPixmapにウィジェットの内容を非表示で直接描画する方法

QWidget *w = new QWidget();

// 描画内容の設定
// (略)

// 描画先の用意
// (略)

// ウィジェットの描画
// スクリーンに表示しない設定とする
w->setAttribute(Qt::WA_DontShowOnScreen);
// showしてウィジェットの描画イベントを走らせる
w->show();
// 描画内容を複写
w->render(&pix);
// 複写内容を保存(確認用)
pix.save("hello.png");

ここまで QPixmap に描画しましたが、render関数は QPainter を引数にすることもできます。

// QPainterを介してウィジェットの表示を描画する方法

QWidget *w = new QWidget();

// 描画内容の設定
// (略)

// 描画先の用意
// ウィジェットと同じサイズを用意
QPixmap pix(w->size());
// QPainterに描画先を設定
QPainter p(&pix);

// ウィジェットの描画
// まず表示してウィジェットの描画イベントを走らせる
w->show();
// QPainterを介して描画内容を複写
w->render(&p);
// 複写内容を保存(確認用)
pix.save("hello.png");

参考

c++ - Qt: How to force a hidden widget to calculate its layout? - Stack Overflow

【Git】gitconfigの分割管理[include]

.gitconfig を管理の際にいくつかのファイルに分けたいといった場合があります。
こんなとき役立つのが[include]です。

[include]は指定したpathのファイルを展開し、.gitconfigの記述として扱います。
以下はユーザー情報をエイリアス設定を別ファイルに記述し、それらを.gitconfigで扱う例です。

# ~/.gitconfig
[include]
    # ユーザー情報
    path = .gitconfig.user
    # gitconfig本体
    path = ~/dotfiles/.gitconfig
# ~/.gitconfig.user
[user]
    name = nagatsuki
    email = nagatsuki30@gmail.com
# ~/dotfiles/.gitconfig
[alias]
    ad  = add

参考

.gitconfig で他のファイルを include - Qiita