Qt4.7.4 に戻しました

http://d.hatena.ne.jp/QtCoder/20140710 (Qt5 に差し替えました
一ヶ月前、Qt5化したアプリケーションを公開したのですが、あまりにトラブルが多いので、結局 Windows/Mac版ともに Qt4.7.4 に戻しました。スーパーハッカーじゃないので、原因の分からないトラブルに弱いんです……。
「Qt5版になってから起動しなくなった」というWindowsユーザーの問題も解消したようですし(当然ですが)、ほっとしています。

Qt5でプリンタを取得できない事がある

  QPrinterInfo pi = QPrinterInfo::defaultPrinter();
  if (pi.isNull())
  {
    // プリンタを取得できない
    QMessageBox::warning( this, "", "", QMessageBox::Ok );
    return;
  }

以上のコードで、Qt4.7.4では概ねプリンタを取得できていましたが、Qt5だとプリンタを取得できない事があるようです。手元の環境だと問題ないのですが……。

Mac OS X 10.7 (Lion) だと落ちる

バグなのかよく分かりませんが、Qt5.3.1 で開発しているアプリケーションの、DockWidgetのタイトルバーを何度かダブルクリックすると(ドッキングしたり解除したりを繰り返す)、

Application Specific Information:
objc_msgSend() selector name: mouseUp:
objc[77628]: garbage collection is OFF

Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0   libobjc.A.dylib               	0x00007fff8b1b8e8c objc_msgSend + 12
1   libqcocoa.dylib               	0x0000000103ef5689 0x103ee8000 + 54921
2   com.apple.AppKit              	0x00007fff892c93a5 -[NSApplication sendEvent:] + 5593
3   libqcocoa.dylib               	0x0000000103f0b09e 0x103ee8000 + 143518
4   com.apple.AppKit              	0x00007fff8925fa0e -[NSApplication run] + 555
5   libqcocoa.dylib               	0x0000000103f07854 0x103ee8000 + 129108
6   QtCore                        	0x000000010229e93d QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) + 381
7   QtCore                        	0x00000001022a1e77 QCoreApplication::exec() + 359

というエラーを吐いて落ちます (ログを見ても原因が分かりません)。
ちなみに、10.9 (Marvericks) だと落ちません。Qt4.7.4 でビルドしても落ちません。どうしたものか…。

MainWindow::closeEvent が二回呼ばれる

バグなのか仕様なのか、よく分かりませんが、Mac版のQt5.3.0 で、

  • 赤いボタンでアプリケーションを閉じると、closeEventは1度しか呼ばれない
  • メニューから "Quit Hoge(アプリ名)" を実行すると、closeEventが2度呼ばれる

同じ悩みを抱えてる人はいないだろうか……これか!?
https://bugreports.qt-project.org/browse/QTBUG-39398 (Regression: closeEvent called twice
Qt5.3.1 では修正された、ってことですかね?

補足

Qt5.3.1で修正されてました

Win32でフォントを列挙する (QtでWin32 API を使う)

int gFontCount = 0;
int CALLBACK EnumFontProc( ENUMLOGFONTEX* lpelf, NEWTEXTMETRIC* lpntm, DWORD fontType, LPARAM lParam )
{
  gFontCount++;
  Widget* widget = (Widget*)lParam;
  widget->setWindowTitle( QString::number(gFontCount) );

  std::wstring ws = &lpelf->elfLogFont.lfFaceName[0];

  return TRUE;
}

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    LOGFONT lf;
    memset( &lf, 0, sizeof(lf) );
    lf.lfCharSet = ANSI_CHARSET;
    EnumFontFamiliesEx( getDC(), &lf, (FONTENUMPROC)EnumFontProc, (LPARAM)this, 0 );
}

さてビルドだ!……と行きたい所ですが、"undefined reference to EnumFontFamiliesExW@20" とコンパイルエラーが出てしまいます。EnumFontFamiliesEx は gdi32.lib なので、*.pro ファイルに、

win32:LIBS += -lgdi32

を追加すればOK。前にもWin32使った事があったのに、忘れてた…。

FireAlpaca を Qt5 に差し替えました

http://firealpaca.com/beta (FireAlpaca Beta研究室
日本 Qtユーザー会の皆様に助けて頂きながら、FireAlpacaのライブラリを Qt4.7.4 から Qt5.3.0 に差し替える事ができました。ありがとうございました。まだ正式版ではないですが、お試し頂ければ幸いです。