それなりにQtわかってきた
レイアウトマネージャとかが何となく分かってきたので、Twitterクライアントをイメージして作ってみたわけです。完全にオフラインで、Twitterとのやり取りはしませんけど。
ソースはこんな感じ
#! /usr/bin/ruby #-*- coding: utf-8 -*- require "Qt" require "kconv" class BirdStrike < Qt::Widget slots "on_tweet()" slots "count_chars()" def initialize super init_ui connects show end def init_ui setWindowTitle("Bird Strike") grid = Qt::GridLayout.new(self) @tlList = Qt::ListWidget.new @twText = Qt::TextEdit.new @twText.setMaximumHeight(60) @charLabel = Qt::Label.new("140") @twButton = Qt::PushButton.new("Tweet", self) grid.addWidget(@tlList, 0, 0, 1, 2) grid.setRowStretch(0, 1) grid.addWidget(@twText, 1, 0, 2, 1) grid.addWidget(@charLabel, 1, 1) grid.addWidget(@twButton, 2, 1) end def connects connect(@twButton, SIGNAL("clicked()"), self, SLOT("on_tweet()")) connect(@twText, SIGNAL("textChanged()"), self, SLOT("count_chars()")) end def on_tweet @tlList.insertItem(0, @twText.plainText) @twText.setText("") end def count_chars n = @twText.plainText.toutf8.length @charLabel.setText((140-n).to_s) end end if __FILE__ == $0 Qt::Application.new(ARGV) do BirdStrike.new exec end end
Tweetボタン押すと、テキストがリストの最上段に挿入されます。
ポイントとしては、Qtプログラミングはconnectが命ということですかね。
SIGNAL("clicked()")とSIGNAL("textChanged()")は、それぞれQt::PushButtonとQt::TextEditで定義されてるものです。このシグナルが発信されたら、自作スロットon_tweet()とcount_chars()が呼ばれるわけです。
迷ったのは、TL部分にListBoxを使おうとしたら
「そんなものは無い」
と言われたこと。探してみたらこちらに同じ悩みがありました。Q&Aってマジ素晴らしい。
↑の回答者さんがリンクしてくれてたところは、リファレンスとして末永くお付き合いできそうなところでしたのでココにも張っておきます → http://doc.qt.digia.com/