Ruby QT4-テキストエディター、パート1

前奏曲
どういうわけか、Yandex辞書を使用してパーサーにGUIを作成する必要がありました(翻訳)。 Kommersantとは何ですか? もちろんルビー。 そう思った。 しかし、GUIプログラミングに精通するためのロシア語のドキュメントと例がほとんど見つからなかったとき、私はどれほど驚きましたか。 英語版はあまり役に立ちませんでした。すべては、hello_worldsのような短いスニペットとメモです。 これはQtを指します。 Qt Disignerサイトには、まだQt3の例があります。 GTK +でGUYを作成する必要がありましたが、その後、洗い直しました-モジュールのWebサイトのドキュメントは、例がなく、不完全、不完全です...

最近、GUIアプリケーションを作成する必要がありました。 しかし、この頃には、Pythonの基礎に精通していたため、私はそれがGUIにどのように関係するかを見ることにしました。 また、上記のQt4のプライバシーでは、 私自身kederast :)、Qt4はすでにQt3を置き換えています。 いずれにせよ、私のデスクトップ上。 そして、私はうれしい驚きをしました-Pythonには多くの例、ドキュメント、 この部分のロシア語で。 また、次のページでPython + QT4の良い例のアセンブリに出会いました: www.rkblog.rk.edu.pl/w/p/python-たとえば-テキストエディターをゼロから作成する。 例ですべてが詳述されている場合、すべてが分解されます。 土曜日午後2時、基礎を理解し、彼のプログラムを書いた。
そして、私は座って、その例ではすべてがうまくいき、Pythonはほぼ同じRubyだと思います。 Kommersantに何かをして、ロシア語とRubyでの例を書き換える必要があります。 実際に今何をしていますか。

それでは、行きましょう。
シンプルなテストエディター。 パート1

次に、簡単なテキストエディター(初心者向けのビューアー)を作成します。

ruby1.8とrbuic4が必要になります。 さらに、後者をインストールする場合、rubyでQt4を操作するために必要なライブラリをインストールする必要があります。
インターフェイスはQt Designer(designer-qt4)で行われます

Qt Designerで、「メインウィンドウ」に基づいて新しいフォームを作成します。
フォームには、「プッシュボタン」タイプの2つのボタンと、テキストを編集するためのフィールド「テキスト編集」を配置します。
画像

最初のボタンについては、テキストを設定します-「ファイルを開く」:[プロパティエディター]ウィンドウの[テキスト]プロパティを使用するか、ボタンをダブルクリックします。
また、ObjectNameを設定します-“ b_open”:再度、プロパティエディターまたはコンテキストメニューでobjectNameの変更を選択します。

メインフォームの場合、objectNameは「notepad」として設定し、Text Editの場合は「editor_window」として設定します

2番目のボタンでは、名前を「close」およびobjectName-「b_close」に設定します。 ボタンはどうすればいいですか? 右、ウィンドウを閉じます。 Signal / Slot EditorウィンドウのQT-Disignerで、新しいスロットを追加します。
送信者-> b_close
信号->クリック()
受信->メモ帳
スロット->閉じる()

そして、プロジェクトをeditor.uiとして保存します

次のコマンドを実行します。
rbuic4 editor.ui -x> editor.rb

Rubyクラスを取得するために-Ui_Notepad。

-xオプションは、アプリケーションを起動するための指示をファイルに追加します。 フォームを実行して、すべてが機能することを確認できます。
ruby -Ku editor.rb

-Kuオプションは、UTF-8を修正するためのものです。

ただし、微妙な点が1つあります。インターフェイスに変更を加えると、editor.rbファイルが書き換えられます。 したがって、フォームを呼び出す別のスクリプトを作成し、start.rbと呼びます。
フォームrbuic4 editor.ui> editor.rbを再生成し、start.rbを次のように記述します。

require 'Qt4'
require 'editor.rb'

class StartQT4 < Qt::MainWindow
def initialize parent=nil
super
@ui = Ui_Notepad.new
@ui.setupUi self
end
end

if $0 == __FILE__
app = Qt::Application.new(ARGV)
myapp = StartQT4.new
myapp.show
app.exec
end


閉じるボタンが機能するようになりました。 開くボタンを設定します。
start.rbに変更を加えます
require 'Qt4'
require 'editor.rb'

class StartQT4 < Qt::MainWindow
#
slots 'file_dialog()'

def initialize parent=nil
super
@ui = Ui_Notepad.new
@ui.setupUi self
# , .
# here we connect signals with our slots
Qt::Object.connect(@ui.b_open, SIGNAL('clicked()'), self, SLOT('file_dialog()'))
end

#, .
def file_dialog
@ui.editor_window.setText 'aaaaaaa'
end

end

if $0 == __FILE__
app = Qt::Application.new(ARGV)
myapp = StartQT4.new
myapp.show
app.exec
end

アプリケーションを実行する場合-(「クリック()」)ボタンをクリックすると、スロット「file_dialog()」が呼び出され、次にfile_dialogメソッドが呼び出されます。これにより、テキスト「aaaaaaaa」がEditTextに挿入されます。

次に、Qt :: FileDialogを使用してファイルを選択します。 次のコード:
require 'Qt4'
require 'editor.rb'

class StartQT4 < Qt::MainWindow

slots 'file_dialog()'

def initialize parent=nil
super
@ui = Ui_Notepad.new
@ui.setupUi self
Qt::Object.connect(@ui.b_open, SIGNAL('clicked()'), self, SLOT('file_dialog()'))
end

def file_dialog
f = Qt::FileDialog
text = File.new(f.getOpenFileName).read
@ui.editor_window.setText text
end
end

if $0 == __FILE__
app = Qt::Application.new(ARGV)
myapp = StartQT4.new
myapp.show
app.exec
end


f.getOpenFileNameは、ファイルの選択(およびファイルパスが返された)後に閉じるファイル選択ダイアログを表示し、コードの実行を中断します。 これは機能しますが、f.getOpenFileNameウィンドウが機能しているときに「キャンセル」をクリックすると、ファイルパスは取得できませんが、次のエラーが表示されます。
start.rb:17: `initialize ':nilをStringに変換できません(TypeError)

画像

つまり ファイルが選択されていない場合は、nilが返されます。 次のコードには、戻り値のチェックが含まれています。
require 'Qt4'
require 'editor.rb'

class StartQT4 < Qt::MainWindow

slots 'file_dialog()'

def initialize parent=nil
super
@ui = Ui_Notepad.new
@ui.setupUi self
Qt::Object.connect(@ui.b_open, SIGNAL('clicked()'), self, SLOT('file_dialog()'))
end

def file_dialog
f = Qt::FileDialog
if @filename = f.getOpenFileName
text = File.new(@filename).read
@ui.editor_window.setText text
end

end

end

if $0 == __FILE__
app = Qt::Application.new(ARGV)
myapp = StartQT4.new
myapp.show
app.exec
end


これでファイルを選択できますが、保存できません。 QTDesignに保存ボタンを追加し、objectNameを「b_save」に割り当てて、新しいUIファイルからGUIを再生成しましょう。
rbuic4 editor.ui > editor.rb

これで、アプリケーションは次のようになります。
画像

ファイルを保存するためのスロットを追加し、プッシュボタンの「保存:」上のシグナル「クリック()」で接続を作成します。
require 'Qt4'
require 'editor.rb'

class StartQT4 < Qt::MainWindow

slots 'file_dialog()' , 'file_save()'

def initialize parent=nil
super
@ui = Ui_Notepad.new
@ui.setupUi self
Qt::Object.connect(@ui.b_open, SIGNAL('clicked()'), self, SLOT('file_dialog()'))
Qt::Object.connect(@ui.b_save, SIGNAL('clicked()'), self, SLOT('file_save()'))
end

def file_dialog
f = Qt::FileDialog
if @filename = f.getOpenFileName
text = File.new(@filename).read
@ui.editor_window.setText text
end
end

def file_save
if @filename
f = File.new @filename, 'w'
f.puts @ui.editor_window.toPlainText
f.close
end
end

end

if $0 == __FILE__
app = Qt::Application.new(ARGV)
myapp = StartQT4.new
myapp.show
app.exec
end


画像

それで、テキストファイルを開き、このファイルへの変更を保存するアプリケーションができました。
次の注では、アプリケーションの機能を拡張します。

Ubuntu 8.10でアプリケーションを実行しましたが、エンコードに問題はありませんでしたが、UTF-8をサポートするruby -Kuキーを忘れないでください。

Z.Y. コードのフォーマット、すみません、初めて投稿するとき。 <code> </ code>タグと似ていますが、すべてが左に移動しました。 コードを個人的にコーディングする方法を教えていただければ幸いです。
Z.Z.Y. 私はまだQtの用語に精通していません。 「接続」、「スロット」とは何かについてもコメントしていただければ嬉しいです。

Source: https://habr.com/ru/post/J54673/


All Articles