| <html> |
| <head> |
| <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> |
| <title>Frequently Asked Questions</title> |
| <link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css"> |
| <meta name="generator" content="DocBook XSL Stylesheets V1.75.2"> |
| <link rel="home" href="../index.html" title="The Boost C++ Libraries BoostBook Documentation Subset"> |
| <link rel="up" href="../signals.html" title="Chapter 18. Boost.Signals"> |
| <link rel="prev" href="../boost/last_value_void_id625017.html" title="Class last_value<void>"> |
| <link rel="next" href="s05.html" title="Design Overview"> |
| </head> |
| <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> |
| <table cellpadding="2" width="100%"><tr> |
| <td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td> |
| <td align="center"><a href="../../../index.html">Home</a></td> |
| <td align="center"><a href="../../../libs/libraries.htm">Libraries</a></td> |
| <td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> |
| <td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> |
| <td align="center"><a href="../../../more/index.htm">More</a></td> |
| </tr></table> |
| <hr> |
| <div class="spirit-nav"> |
| <a accesskey="p" href="../boost/last_value_void_id625017.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../signals.html"><img src="../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="s05.html"><img src="../../../doc/src/images/next.png" alt="Next"></a> |
| </div> |
| <div class="section"> |
| <div class="titlepage"><div><div><h2 class="title" style="clear: both"> |
| <a name="id2536569"></a>Frequently Asked Questions</h2></div></div></div> |
| <div class="qandaset"> |
| <a name="id2536576"></a><dl> |
| <dt>1. <a href="s04.html#id2536578">Don't noncopyable signal semantics mean that a class |
| with a signal member will be noncopyable as well?</a> |
| </dt> |
| <dt>2. <a href="s04.html#id2536601">Is Boost.Signals thread-safe?</a> |
| </dt> |
| <dt>3. <a href="s04.html#id2536622">How do I get Boost.Signals to work with Qt?</a> |
| </dt> |
| </dl> |
| <table border="0" width="100%" summary="Q and A Set"> |
| <col align="left" width="1%"> |
| <col> |
| <tbody> |
| <tr class="question"> |
| <td align="left" valign="top"> |
| <a name="id2536578"></a><a name="id2536581"></a><p><b>1.</b></p> |
| </td> |
| <td align="left" valign="top"><p>Don't noncopyable signal semantics mean that a class |
| with a signal member will be noncopyable as well?</p></td> |
| </tr> |
| <tr class="answer"> |
| <td align="left" valign="top"></td> |
| <td align="left" valign="top"><p>No. The compiler will not be able to generate a copy |
| constructor or copy assignment operator for your class if it |
| has a signal as a member, but you are free to write your own |
| copy constructor and/or copy assignment operator. Just don't |
| try to copy the signal.</p></td> |
| </tr> |
| <tr class="question"> |
| <td align="left" valign="top"> |
| <a name="id2536601"></a><a name="id2536604"></a><p><b>2.</b></p> |
| </td> |
| <td align="left" valign="top"><p>Is Boost.Signals thread-safe?</p></td> |
| </tr> |
| <tr class="answer"> |
| <td align="left" valign="top"></td> |
| <td align="left" valign="top"><p>No. Using Boost.Signals in a multithreaded concept is |
| very dangerous, and it is very likely that the results will be |
| less than satisfying. Boost.Signals will support thread safety |
| in the future.</p></td> |
| </tr> |
| <tr class="question"> |
| <td align="left" valign="top"> |
| <a name="id2536622"></a><a name="id2536624"></a><p><b>3.</b></p> |
| </td> |
| <td align="left" valign="top"><p>How do I get Boost.Signals to work with Qt?</p></td> |
| </tr> |
| <tr class="answer"> |
| <td align="left" valign="top"></td> |
| <td align="left" valign="top"> |
| <p>When building with Qt, the Moc keywords |
| <code class="computeroutput">signals</code> and <code class="computeroutput">slots</code> are defined using |
| preprocessor macros, causing programs using Boost.Signals and |
| Qt together to fail to compile.</p> |
| <p><span class="emphasis"><em>For Qt 4.1 and later</em></span>, This behavior |
| can be turned off in Qt on a per-project or per-file basis |
| with the <code class="computeroutput">no_keywords</code> option. This works with |
| out-of-the-box builds of Boost and Qt. You do not need to |
| re-configure, re-build, or duplicate existing libraries. For a |
| project where you want to use both Boost.Signals and Qt |
| Signals and Slots, the relevant part of your .pro file might |
| look like this:</p> |
| <pre class="programlisting"> |
| CONFIG += no_keywords # so Qt won't #define any non-all-caps `keywords' |
| INCLUDEPATH += . /usr/local/include/boost-1_33_1/ |
| macx:LIBS += /usr/local/lib/libboost_signals-1_33_1.a # ...your exact paths may vary |
| </pre> |
| <p>Now you can mix Boost.Signals and Qt Signals and Slots |
| in the same files, and even within the same class or function. |
| You will have to use the upper-case versions of Qt macros in |
| your own code. See the article <a href="http://scottcollins.net/articles/a-deeper-look-at-signals-and-slots.html" target="_top">A |
| Deeper Look at Signals and Slots</a> [off-site] for more |
| complete examples and a survey of the strengths of the two |
| systems.</p> |
| <p><span class="emphasis"><em>Older versions of Qt</em></span> did not |
| provide a reliable mechanism for avoiding these unfriendly, |
| all lower-case `keyword'-like macros. Although this is a |
| problem with Qt and not Boost.Signals, a user can use the two |
| systems together with a little extra effort. There are two |
| ways to do this:</p> |
| <p>The first way involves defining |
| the <code class="computeroutput">BOOST_SIGNALS_NAMESPACE</code> |
| macro to some other identifier (e.g., <code class="computeroutput">signalslib</code>) |
| when building and using the Boost.Signals library. Then the |
| namespace of the Boost.Signals library will be |
| <code class="computeroutput">boost::BOOST_SIGNALS_NAMESPACE</code> instead of |
| <code class="computeroutput">boost::signals</code>. To retain the original namespace |
| name in translation units that do not interact with Qt, you |
| can use a namespace alias:</p> |
| <pre class="programlisting"> |
| namespace boost { |
| namespace signals = BOOST_SIGNALS_NAMESPACE; |
| } |
| </pre> |
| <p>The second way, provided by Frank Hess and improved by |
| Niels Dekker, involves |
| creating a header <code class="computeroutput">signalslib.hpp</code> that contains |
| the following code:</p> |
| <pre class="programlisting">#ifndef SIGNALSLIB_HPP_INCLUDED |
| #define SIGNALSLIB_HPP_INCLUDED |
| |
| #if defined(signals) && defined(QOBJECTDEFS_H) && \ |
| !defined(QT_MOC_CPP) |
| # undef signals |
| # define signals signals |
| #endif |
| |
| #include <boost/signal.hpp> |
| namespace boost |
| { |
| namespace signalslib = signals; |
| } |
| |
| #if defined(signals) && defined(QOBJECTDEFS_H) && \ |
| !defined(QT_MOC_CPP) |
| # undef signals |
| // Restore the macro definition of "signals", as it was |
| // defined by Qt's <qobjectdefs.h>. |
| # define signals protected |
| #endif |
| |
| #endif</pre> |
| <p>Use this header to include the Boost library, then refer |
| to it in the namespace <code class="computeroutput">boost::signalslib</code>. This |
| option is often |
| preferable to the first option because it can be used without |
| recompiling the Signals library binary. </p> |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| </div> |
| </div> |
| <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> |
| <td align="left"><p><small>Last revised: May 21, 2008 at 21:57:05 +0100</small></p></td> |
| <td align="right"><div class="copyright-footer">Copyright © 2001-2004 Douglas Gregor<p>Use, modification and distribution is subject to the Boost |
| Software License, Version 1.0. (See accompanying file |
| <code class="filename">LICENSE_1_0.txt</code> or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)</p> |
| </div></td> |
| </tr></table> |
| <hr> |
| <div class="spirit-nav"> |
| <a accesskey="p" href="../boost/last_value_void_id625017.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../signals.html"><img src="../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="s05.html"><img src="../../../doc/src/images/next.png" alt="Next"></a> |
| </div> |
| </body> |
| </html> |