<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>Comments on: Приватные слоты в паттерне Pimpl от Qt.</title>
	<atom:link href="http://erudenko.com/wordpress/?feed=rss2&#038;p=162" rel="self" type="application/rss+xml" />
	<link>http://erudenko.com/wordpress/?p=162</link>
	<description>Research and development blog of Rudenko Eugene</description>
	<lastBuildDate>Mon, 06 Sep 2010 19:02:42 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
	<item>
		<title>By: Rudenko Eugene</title>
		<link>http://erudenko.com/wordpress/?p=162&#038;cpage=1#comment-335</link>
		<dc:creator>Rudenko Eugene</dc:creator>
		<pubDate>Tue, 30 Mar 2010 15:46:55 +0000</pubDate>
		<guid isPermaLink="false">http://erudenko.com/wordpress/?p=162#comment-335</guid>
		<description>// так работает… но этот приватный слот принадлежит публичному классу, и соответственно его объявление в hpp файле “портит”
// QObject::connect(d-&gt;actionShow, SIGNAL(activated()), this, SLOT(showWidget()));

так правильно, по факту слоты принадлежат публичному классу, так как слоты должны быть только у наследников QObject, к коим приватный класс не относится
Поэтому коннектить сигнал нужно к слоту публичного класса, а вот реализация этого слота нахоится в приватном классе, Получается интерфейс слота в публичном а реализация в приватном.

И ничто так никого не портит :-)

Слоты приватного класса можно естественно использовать в дезайнере, так как по факту это слоты публичного класса, которые дизайнеру соответсвенно доступны.

да и небольшая ремарка к коду

boost::shared_ptr myWidget;
нецелесообразно &quot;мешать&quot; буст в данном случае с Qt, так как в Qt есть QSharedPointer который в данном случае уместней.</description>
		<content:encoded><![CDATA[<p>// так работает… но этот приватный слот принадлежит публичному классу, и соответственно его объявление в hpp файле “портит”<br />
// QObject::connect(d->actionShow, SIGNAL(activated()), this, SLOT(showWidget()));</p>
<p>так правильно, по факту слоты принадлежат публичному классу, так как слоты должны быть только у наследников QObject, к коим приватный класс не относится<br />
Поэтому коннектить сигнал нужно к слоту публичного класса, а вот реализация этого слота нахоится в приватном классе, Получается интерфейс слота в публичном а реализация в приватном.</p>
<p>И ничто так никого не портит <img src='http://erudenko.com/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Слоты приватного класса можно естественно использовать в дезайнере, так как по факту это слоты публичного класса, которые дизайнеру соответсвенно доступны.</p>
<p>да и небольшая ремарка к коду</p>
<p>boost::shared_ptr myWidget;<br />
нецелесообразно &#8220;мешать&#8221; буст в данном случае с Qt, так как в Qt есть QSharedPointer который в данном случае уместней.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: mAX</title>
		<link>http://erudenko.com/wordpress/?p=162&#038;cpage=1#comment-332</link>
		<dc:creator>mAX</dc:creator>
		<pubDate>Sat, 27 Mar 2010 15:58:27 +0000</pubDate>
		<guid isPermaLink="false">http://erudenko.com/wordpress/?p=162#comment-332</guid>
		<description>Да, и кстати... можно ли использовать слоты приватного класса виджета из QtDesigner&#039;а при создании виджетов? Я не знал как это сделать, поэтому пришлось весь сгенерированный код внести в приватный класс.</description>
		<content:encoded><![CDATA[<p>Да, и кстати&#8230; можно ли использовать слоты приватного класса виджета из QtDesigner&#8217;а при создании виджетов? Я не знал как это сделать, поэтому пришлось весь сгенерированный код внести в приватный класс.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: mAX</title>
		<link>http://erudenko.com/wordpress/?p=162&#038;cpage=1#comment-331</link>
		<dc:creator>mAX</dc:creator>
		<pubDate>Sat, 27 Mar 2010 15:46:42 +0000</pubDate>
		<guid isPermaLink="false">http://erudenko.com/wordpress/?p=162#comment-331</guid>
		<description>Здравствуйте! У меня вот вопрос возник)
Пишу код, в коде получается много инклудов и из-за этого &quot;раздутый&quot; проект очень долго компилится при изменении *.hpp файлов. Даже если там просто приватную переменную добавили.
Штука про которую Вы написали мне очень помогла!!) Это просто супер, хоть и немного не удобно.

Вопрос такой: Я сделал приватный класс для QWidget класса, ну или скажем для QMainWindow, думаю это не важно. Т.к. у Вас в примере был конструкор explicit MyClass(QObject *parent = 0); а сам класс от QObject, то в моем случае класс наследуется от, например, QMainWindow, тогда протектед конструктор для публичного класса... морды чеширского кота) я пишу так:
MainFrame::MainFrame(MainFramePrivate &amp;dd, QWidget * parent) : QMainWindow(parent) ,d_ptr(&amp;dd) ...
Правильно ли я его записал?

У меня вроде все работает с приватными переменными, но со слотами не работает... прога собирается, но они просто не срабатывают.

В приватном классе я объявил 
class MainFramePrivate {
    Q_DECLARE_PUBLIC(MainFrame);
public:
    MainFramePrivate();
    virtual ~MainFramePrivate();
    MainFrame * q_ptr;
    void Init(void);
    boost::shared_ptr myWidget;
    void _q_showWidget();

    // пункт меню, которое инициализируется в Init()
    QAction *actionShow;

    // прочая фигня... кнопки, меню и т.д.
};


реализация методов и конструкторов выглядит примерно так:

void MainFramePrivate::Init(void) {
    Q_Q(MainFrame);
    actionShow = new QAction(q);
    // Тут инициализирую менюшку... с моей кнопкой
    q-&gt;setMenuBar(menubar);

   // можно ли тут вызвать QObject::connect чтобы связать сигнал объекта actionShow со слотом _q_showWidget?? Если можно, то подскажите, пожалуйста, как.
}

void MainFramePrivate::_q_showWidget() {
    myWidget-&gt;show();
}

MainFrame::MainFrame(QWidget *parent) : QMainWindow(parent) , d_ptr(new MainFramePrivate()) {
    Q_D(MainFrame);
    d-&gt;q_ptr = this;
    d-&gt;Init();
    
    // так работает... но этот приватный слот принадлежит публичному классу, и соответственно его объявление в hpp файле &quot;портит&quot;
    // QObject::connect(d-&gt;actionShow, SIGNAL(activated()), this, SLOT(showWidget()));

    // а так не работает...
    // QObject::connect(d-&gt;actionShow, SIGNAL(activated()), this, SLOT(d-&gt;_q_showWidget()));
}

MainFrame::MainFrame(MainFramePrivate &amp;dd, QWidget * parent) : QMainWindow(parent) ,d_ptr(&amp;dd) {
    Q_D(MainFrame);
    d-&gt;q_ptr = this;
}

void MainFrame::showWidget() {
    Q_D(MainFrame);
    d-&gt;myWidget-&gt;show();
}

Не знаю будет ли тут удобным смотреть код, но если нормально запостится, то посмотрите в чем ошибка, пожалуйста. Спасибо!</description>
		<content:encoded><![CDATA[<p>Здравствуйте! У меня вот вопрос возник)<br />
Пишу код, в коде получается много инклудов и из-за этого &#8220;раздутый&#8221; проект очень долго компилится при изменении *.hpp файлов. Даже если там просто приватную переменную добавили.<br />
Штука про которую Вы написали мне очень помогла!!) Это просто супер, хоть и немного не удобно.</p>
<p>Вопрос такой: Я сделал приватный класс для QWidget класса, ну или скажем для QMainWindow, думаю это не важно. Т.к. у Вас в примере был конструкор explicit MyClass(QObject *parent = 0); а сам класс от QObject, то в моем случае класс наследуется от, например, QMainWindow, тогда протектед конструктор для публичного класса&#8230; морды чеширского кота) я пишу так:<br />
MainFrame::MainFrame(MainFramePrivate &amp;dd, QWidget * parent) : QMainWindow(parent) ,d_ptr(&amp;dd) &#8230;<br />
Правильно ли я его записал?</p>
<p>У меня вроде все работает с приватными переменными, но со слотами не работает&#8230; прога собирается, но они просто не срабатывают.</p>
<p>В приватном классе я объявил<br />
class MainFramePrivate {<br />
    Q_DECLARE_PUBLIC(MainFrame);<br />
public:<br />
    MainFramePrivate();<br />
    virtual ~MainFramePrivate();<br />
    MainFrame * q_ptr;<br />
    void Init(void);<br />
    boost::shared_ptr myWidget;<br />
    void _q_showWidget();</p>
<p>    // пункт меню, которое инициализируется в Init()<br />
    QAction *actionShow;</p>
<p>    // прочая фигня&#8230; кнопки, меню и т.д.<br />
};</p>
<p>реализация методов и конструкторов выглядит примерно так:</p>
<p>void MainFramePrivate::Init(void) {<br />
    Q_Q(MainFrame);<br />
    actionShow = new QAction(q);<br />
    // Тут инициализирую менюшку&#8230; с моей кнопкой<br />
    q-&gt;setMenuBar(menubar);</p>
<p>   // можно ли тут вызвать QObject::connect чтобы связать сигнал объекта actionShow со слотом _q_showWidget?? Если можно, то подскажите, пожалуйста, как.<br />
}</p>
<p>void MainFramePrivate::_q_showWidget() {<br />
    myWidget-&gt;show();<br />
}</p>
<p>MainFrame::MainFrame(QWidget *parent) : QMainWindow(parent) , d_ptr(new MainFramePrivate()) {<br />
    Q_D(MainFrame);<br />
    d-&gt;q_ptr = this;<br />
    d-&gt;Init();</p>
<p>    // так работает&#8230; но этот приватный слот принадлежит публичному классу, и соответственно его объявление в hpp файле &#8220;портит&#8221;<br />
    // QObject::connect(d-&gt;actionShow, SIGNAL(activated()), this, SLOT(showWidget()));</p>
<p>    // а так не работает&#8230;<br />
    // QObject::connect(d-&gt;actionShow, SIGNAL(activated()), this, SLOT(d-&gt;_q_showWidget()));<br />
}</p>
<p>MainFrame::MainFrame(MainFramePrivate &amp;dd, QWidget * parent) : QMainWindow(parent) ,d_ptr(&amp;dd) {<br />
    Q_D(MainFrame);<br />
    d-&gt;q_ptr = this;<br />
}</p>
<p>void MainFrame::showWidget() {<br />
    Q_D(MainFrame);<br />
    d-&gt;myWidget-&gt;show();<br />
}</p>
<p>Не знаю будет ли тут удобным смотреть код, но если нормально запостится, то посмотрите в чем ошибка, пожалуйста. Спасибо!</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: asvil</title>
		<link>http://erudenko.com/wordpress/?p=162&#038;cpage=1#comment-277</link>
		<dc:creator>asvil</dc:creator>
		<pubDate>Fri, 12 Feb 2010 12:04:14 +0000</pubDate>
		<guid isPermaLink="false">http://erudenko.com/wordpress/?p=162#comment-277</guid>
		<description>Теперь я уже прозрел к приватным слотам.
........конструкторе бы была такая запись:
QTimer::singleShot(1000,this,SLOT(_q_boo()));.......

Поправте пожалуйста на:
QTimer::singleShot(1000,q,SLOT(_q_boo()));</description>
		<content:encoded><![CDATA[<p>Теперь я уже прозрел к приватным слотам.<br />
&#8230;&#8230;..конструкторе бы была такая запись:<br />
QTimer::singleShot(1000,this,SLOT(_q_boo()));&#8230;&#8230;.</p>
<p>Поправте пожалуйста на:<br />
QTimer::singleShot(1000,q,SLOT(_q_boo()));</p>
]]></content:encoded>
	</item>
</channel>
</rss>
