yu00’s blog

プログラミングに関する備忘録です

PyQt5でのプログラミングの基本

PyQt5入門 PythonでGUI作成 - yu00’s blog


PyQt5で必要最小限のプログラミングは次のようになります.

サンプルコード

#! /usr/bin/python3
# -*- coding: utf-8 -*-

import sys
from PyQt5 import QtWidgets

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    
    window = QtWidgets.QWidget()
    window.show()
    
    sys.exit(app.exec_())

これはウィンドウを作成し表示するプログラムです.

実行結果

f:id:yu00:20150901011559p:plain

サンプルコード解説

アプリケーション作成

app = QtWidgets.QApplication(sys.argv)

PyQt5のプログラムでは最初に上のように
アプリケーションオブジェクトを作る必要があります.
sys.argvはコマンドライン引数のリストです.

ウィジェットの作成

window = QtWidgets.QWidget()

PyQt5ではウィジェットユーザーインターフェースを提供する
基本的なクラスになっています.
QWidgetオブジェクトを作成することでウィンドウが作成されます.

ウィジェットの表示

window.show()

QWidget.show()を呼ぶことでウィンドウが表示されます.

アプリケーション実行

sys.exit(app.exec_())

最後にアプリケーションのメインループに入り,
アプリケーションを実行します.

PyQt5入門 PythonでGUI作成

PythonGUIを作成できるPyQt5について,使い方を説明していきます.

注意

  • Pythonの基本を知っていることを前提としています
  • Pythonは3.x系です
  • 情報,プログラムの正確さには細心の注意を払っていますが,それらの正確性は保証できません.間違いがありましたら指摘してくださるとありがたいです

リンク・参考資料

PyQt5の基本

基本ウィジェット

(作成中)

基本レイアウト

(作成中)

シグナルとスロット

スタイル

関連クラス

  • QPixmapクラス

VisualStudio2013でEmacsキーバインド

VisualStudio2013をEmacsキーバインドにするさいのメモです.

emacs.vsixのインストール

まず次のリンク先からemacs.vsixをダウンロードします.
owainlewis/emacs-visual-studio-2013 · GitHub

そして,ダウンロードしたemacs.vsixを実行します.
インストール画面が表示されるので手順にそって進めていけば
VisualStudio2013にインストールされます.

Emacs.vskを配置

ダウンロードしたemacs.vsixの拡張子をvsixからzipに変更し,
展開します.
展開したファイルの中にEmacs.vskというファイルがあるので,それを
C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE
にコピーします.

VisualStudioの設定

VisualStudioを起動し,
[ツール]->[オプション]->[環境]->[キーボード]の
[次の追加キーボードマップスキームを適用]で[Emacs]を選択します.

その下にショートカットを変更できる項目があるので,
ショートカットを自分好みに変えることもできます.

これでVisualStudioでEmacsキーバインドが使用できます.

よくわかるクイックソート解説

ソートのアルゴリズムであるクイックソートについて
できるだけ分かりやすくなるよう心がけて解説していきます.

クイックソートの考え方

クイックソートは次のような処理を行っています

  • 1. バラバラなデータからランダムな数(ピボット)を選択する.

f:id:yu00:20150529172847g:plain
f:id:yu00:20150529172921g:plain

  • 2. 選択した数より大きいグループと小さいグループに分ける

f:id:yu00:20150529172952g:plain

  • 3. 2つのグループそれぞれに対して,1,2の処理を行い,さらに分割する

f:id:yu00:20150529173143g:plain

このように,ランダムな数を選択->大小2グループに分割->
それぞれのグループを更に分割
と,分割を繰り返していくことでソートが完了します.
f:id:yu00:20150529173311g:plain

ソースコード

C言語ソースコード例は次のようになります.

#include <stdio.h>

// data1とdata2を入れ替える
void swap(int *data1, int *data2)
{
	int tmp = *data1;
	*data1 = *data2;
	*data2 = tmp;
}

// ピボットのIDを選ぶ.この関数の中身を変えることで
// クイックソートの性能が変化する.
int choose_pivot_id(int data[], int leftID, int rightID)
{
	return leftID;
}

// data[leftID]~data[rightID]までのデータを
// pivotより大きいグループと小さいグループに分ける
// pivotがある場所のIDを返す
int partition(int data[], int leftID, int rightID, int pivotID)
{
	int pivot = data[pivotID];
	// いったんpivotを右端に保存しておく
	swap(&data[pivotID], &data[rightID]);
	// 左端から見て行き,pivot以下のデータを
	// 左へ移動していく
	int p = leftID;
	int i;
	for(i = leftID; i <= rightID-1; i++){
		if(data[i] <= pivot){
			swap(&data[i], &data[p]);
			p++;
		}
	}
	// pがグループの境界になるので
	// 保存しておいたpivotをpの位置に移動する
	swap(&data[p], &data[rightID]);
	return p;
}

void quick_sort(int data[], int leftID, int rightID)
{
	if(leftID >= rightID) return;
	// ピボットのIDを選ぶ
	int pivotID = choose_pivot_id(data, leftID, rightID);
	// pivotより大きいグループと小さいグループに分ける
	int p = partition(data, leftID, rightID, pivotID);
	// 左側をクイックソート
	quick_sort(data, leftID, p-1);
	// 右側をクイックソート
	quick_sort(data, p+1, rightID);
}

int main(void) {

	int data[] = {3,4,5,1,2};
	int i;

	quick_sort(data, 0, 4);

	for(i = 0; i < 5; i++){
		printf("%d\n", data[i]);
	}
	return 0;
}

ソースコード解説

partition()

partition()は次のような処理をしています.

まず,ピボットをいったん右端に移動し,保存しておきます.
f:id:yu00:20150529174204g:plain

次にiとpを左端にセットします.
f:id:yu00:20150529174312g:plain

そしてiを動かし左から順に見て行き,ピボット以下のデータを
検索します.
ピボット以下のデータが見つかったらpの位置と入れ替えます.
f:id:yu00:20150529174411g:plain

データ入れ替えたらpの位置を一つ右へ動かします.
f:id:yu00:20150529174614g:plain

ピボット以下のデータを検索->入れ替え->p++を繰り返します.
f:id:yu00:20150529174709g:plain
f:id:yu00:20150529174718g:plain

この処理を繰り返していくことで,最終的に
pの位置を境にして,左はピボット以下,右はピボットより
大きいデータとなります.
f:id:yu00:20150529174844g:plain

最後にpの位置と,保存しておいたピボットを入れ替えます.
f:id:yu00:20150529174942g:plain

これでピボットより左はピボット以下,
ピボットより右はピボットより大きいデータとなります.

LaTeXで色付きソースコードを貼り付け

LaTeXC言語などのソースコードを色付きで貼り付けるには,
jlistingパッケージを使うといいです.
インストール方法については省略します.

使い方の例

texファイル

% (省略)
\usepackage{color}
\usepackage{listings,jlisting}

\lstset{
language={C},
backgroundcolor={\color[gray]{.85}},
basicstyle={\small},
identifierstyle={\small},
commentstyle={\small\ttfamily \color[rgb]{0,0.5,0}},
keywordstyle={\small\bfseries \color[rgb]{1,0,0}},
ndkeywordstyle={\small},
stringstyle={\small\ttfamily \color[rgb]{0,0,1}},
frame={tb},
breaklines=true,
columns=[l]{fullflexible},
numbers=left,
xrightmargin=0zw,
xleftmargin=3zw,
numberstyle={\scriptsize},
stepnumber=1,
numbersep=1zw,
morecomment=[l]{//}
}

\begin{document}

% ソースコードが別ファイルの場合
\lstinputlisting[caption=キャプション,label=ラベル]{test.c}

% ソースコードを直接記入
\begin{lstlisting}[caption=キャプション,label=ラベル]
#include <stdio.h>
int main(void) {
	//	コメント
	printf("Hello World");
	return 0;
}
\end{lstlisting}
% (省略)

実行例

f:id:yu00:20150514190319g:plain

オプション

\lstsetで指定できる主なオプションは次のようになります.

language

言語の指定.C言語ならCとします.
標準で使える言語は以下だそうです.

ABAP (R/2 4.3, R/2 5.0, R/3 3.1, R/3 4.6C, R/3 6.10), 
ACM, ACMscript, ACSL, Ada (2005, 83, 95), Algol (60, 68), 
Ant, Assembler (Motorola68k, x86masm), Awk (gnu, POSIX), 
bash, Basic (Visual), C (ANSI, Handel, Objective, Sharp), 
C++ (ANSI, GNU, ISO, Visual) Caml (light, Objective), CIL, 
Clean, Cobol (1974, 1985, ibm), Comal 80, 
command.com (WinXP), Comsol, csh, Delphi, Eiffel, Elan, 
erlang, Euphoria, Fortran (03, 08, 77, 90, 95), 
GAP, GCL, Gnuplot, hansl, Haskell, HTML, IDL (empty, CORBA), 
inform, Java (empty, AspectJ), JVMIS, ksh, 
Lingo, Lisp (empty, Auto), LLVM, Logo, Lua (5.0, 5.1, 5.2), 
make (empty, gnu), Mathematica (1.0, 3.0, 5.2), Matlab, 
Mercury, MetaPost, Miranda, Mizar, ML, Modula-2, MuPAD, 
NASTRAN, Oberon-2, OCL (decorative, OMG), Octave, Oz, 
Pascal (Borland6, Standard, XSC), Perl, PHP, PL/I, Plasm, 
PostScript, POV, Prolog, Promela, PSTricks, Python, R, Reduce, 
Rexx, RSL, Ruby, S (empty, PLUS), SAS, Scilab, sh, SHELXL, 
Simula (67, CII, DEC, IBM), SPARQL, SQL, tcl (empty, tk), 
TeX (AlLaTeX, common, LaTeX, plain, primitive), VBScript, 
Verilog, VHDL (empty, AMS), VRML (97), XML, XSLT
numbers

行番号表示位置.デフォルト:none(行番号なし),
他オプション:left,right

stepnumber

行番号をいくつとばしで表示するか.
5行ごとに行番号を表示したいときなど

numberstyle

行番号の書体

numbersep

行番号と本文の間隔.デフォルト:10pt
f:id:yu00:20150514203611g:plain

breaklines

行が長くなったときの自動改行.デフォルト:false

breakindent

breaklinesで改行した時のインデント量.デフォルト:20pt

frame

枠.デフォルト:none
他オプション:leftline,topline,bottomline,lines,single,shadowbox

framesep

frameまでの間隔

basicstyle

標準の書体

identifierstyle

キーワードでない文字の書体

commentstyle

コメントの書体

stringstyle

""で囲まれたなどの"文字"の書体

keywordstyle

キーワード(int, ifなど)の書体

ndkeywordstyle

キーワードその2の書体

columns

書体による列幅の違いを調整するか.
オプション:fixed,flexible,spaceflexible,fullflexible
f:id:yu00:20150514212830g:plain

その他

  • コメントの後には1文字スペースが必要です
  • \lstsetを使い途中で書体を変えることもできます.