技術ネタを書けるような人間になりたいという心情を詠んだ句

それなりに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/