<div>Thanks Mark, I did some things that you recommended:<br></div><div><br></div><div>I changed the notebook class, so it inherits from QWIdget and no container need to be used, the notebook itself is going to be embedded in the QScrollArea:</div>
<div><br></div><div>class Notebook(QtGui.QWidget):<br>      def __init__(self,parent):<br>              QtGui.QWidget.__init__(self,parent)<br></div><div>...</div><div>...</div><div>        self.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu)<br>
              self.new_cell_action=QtGui.QAction(&quot;new cell&quot;,self)<br>              self.addAction(self.new_cell_action)<br>        <br>              self.connect(self.new_cell_action,QtCore.SIGNAL(&quot;triggered(bool)&quot;),self.new_cell_slot)<br>
</div><div><br></div><div>The new_cell_slot calls the function to create the a new cell, which has not changed since last mail (I&#39;m not calculation yet the size of the cells).</div><div>The problem persists even if I make the QAction parent to be the notebook. The cell are appended in the _cell_list attribute but not showed when the QAction is calling the new_input_cell function.</div>
<div><br></div><div>This is a fragment of the main file:</div><div><br></div><div>class IpythonQt(QtGui.QMainWindow,Ui_Qtipython):</div><div>    def __init__(self):<br>              QtGui.QMainWindow.__init__(self)<br>              self.setupUi(self)<br>
        <br>              self.scrollArea = QtGui.QScrollArea(self.centralwidget)<br>              self.scrollArea.setWidgetResizable(True)<br>        self.verticalLayout_2.addWidget(self.scrollArea)<br>              self.nb=Notebook(self.scrollArea)<br>
</div><div>        self.scrollArea.setWidget(self.nb)<br>              self.nb.new_input_cell()<br></div><div><br></div><div>The code can be found at <a href="http://github.com/muzgash/ipython/tree/master/IPython/gui/qt/">http://github.com/muzgash/ipython/tree/master/IPython/gui/qt/</a></div>
<div><font color="#888888"><br><br>Best regards.<br>--<br><a href="http://he1.udea.edu.co/gweb" target="_blank">Gerardo Gutiérrez Gutiérrez</a><br>Physics student<br>Universidad de Antioquia<br>Computational physics and astrophysics group (<a href="http://urania.udea.edu.co/sites/sites.php" target="_blank">FACom</a>)<br>



Computational science and development branch(<a href="http://urania.udea.edu.co/sites/facom-dev/" target="_blank">FACom-dev</a>)<br>Usuario Linux #492295</font><br><br>
<br>
</div><div><br></div><br><div class="gmail_quote">On 6 June 2010 01:58, Mark Summerfield <span dir="ltr">&lt;<a href="mailto:list@qtrac.plus.com">list@qtrac.plus.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
Hi Gerardo,<br>
<br>
I&#39;m not sure I can help but have a few comments...<br>
<div class="im"><br>
On 2010-06-06, Gerardo Gutierrez wrote:<br>
&gt; Hi, I&#39;m writing a frontend for ipython and I&#39;ve a problem with a context<br>
&gt; menu...<br>
&gt; The frontend is based on mathematica so it has cells when you can write<br>
&gt;  code and execute it (not yet implemented)<br>
&gt; So the cells are QPlainTextEdits which are embedded in a QWidget:<br>
&gt;<br>
&gt; class Notebook(QtCore.QObject):<br>
&gt;       def __init__(self,parent):<br>
&gt;         QtCore.QObject.__init__(self)<br>
&gt;         self._container=QtGui.QWidget(parent)<br>
&gt;         self._nb_menu=NbContextMenu(self._container)<br>
<br>
</div>I don&#39;t really understand why Notebook doesn&#39;t inherit QWidget directly.<br>
<div class="im"><br>
&gt;<br>
self.connect(self._nb_menu.new_cell,QtCore.SIGNAL(&quot;triggered(bool)&quot;),self.n<br>
&gt; ew_cell_slot) self._container.mousePressEvent = self.nb_mouse_click_event<br>
&gt;<br>
&gt; so the last line is for the context menu to popup con right click:<br>
&gt;<br>
&gt;         def nb_mouse_click_event(self,event):<br>
&gt;             if event.button()==QtCore.Qt.RightButton:<br>
&gt;                 self._nb_menu.popup(event.globalPos())<br>
<br>
</div>Do you really need to implement such a low-level event handler?<br>
If Notebook inherits QWidget rather than QObject you can set its context<br>
menu policy either to Qt.ActionsContextMenu (in which case you can add<br>
the actions directly to the Notebook using addAction()), or to<br>
Qt.CustomContextMenu (in which case you connect the<br>
customContextmenuRequested() signal to a slot where you create the<br>
context menu yourself).<br>
<div class="im"><br>
&gt; The NbContextMenu class is described here:<br>
&gt;<br>
&gt; class NbContextMenu(QtGui.QMenu):<br>
&gt;     def __init__(self,parent):<br>
&gt;         QtGui.QMenu.__init__(self,parent)<br>
&gt;         self.set_actions()<br>
&gt;<br>
&gt;         def set_actions(self):<br>
&gt;             self.new_cell=QtGui.QAction(&quot;new cell&quot;,self)<br>
&gt;             self.addAction(self.new_cell)<br>
<br>
</div>I don&#39;t understand why you need this class. If Notebook is a QWidget you<br>
can use one of the techniques I mentioned above. But if it is a QObject<br>
then why not use a plain QMenu and use its addAction() method to add<br>
actions to it directly?<br>
<div class="im"><br>
&gt; The connection showed above calls a slot which calls a function to create<br>
a<br>
&gt; new cell in the QWidget called _container:<br>
&gt;<br>
&gt; def new_input_cell(self,index=0):<br>
&gt;     cell=InputCell(self._container)<br>
&gt;     if index==0:<br>
&gt;         prev_cell=self._cell_list[len(self._cell_list)-1]<br>
&gt;<br>
&gt;<br>
cell.setGeometry(QtCore.QRect(0,prev_cell.pos().y()+prev_cell.height()+5,39<br>
&gt; 5,60)) self._cell_list.append(cell)<br>
&gt;     else:<br>
&gt;         prev_cell=self._cell_list[index-1]<br>
&gt;<br>
&gt;<br>
cell.setGeometry(QtCore.QRect(0,prev_cell.pos().y()+prev_cell.height()+5,39<br>
&gt; 5,60)) self._cell_list.insert(index,cell)<br>
&gt;    cell.index=self._cell_list.index(cell)<br>
&gt;    self.connect(cell,QtCore.SIGNAL(&quot;cell_index&quot;),self.active_cell_signal)<br>
&gt;<br>
&gt;<br>
self.connect(cell,QtCore.SIGNAL(&quot;blockCountChanged(int)&quot;),self.expand_cell<br>
&gt; )<br>
<br>
</div>Using hard-coded numbers will make the application fragile. You might<br>
get away with little tweaks like +5, but for the 39 and 60 it would be<br>
better to compute them, for example based on QApplication.globalStrut().<br>
<div class="im"><br>
&gt; The problem is then, that through the QMenu QAction the cells are being<br>
&gt; appended but not showed. This doesn&#39;t happen if I call the function<br>
&gt; new_input_cell from the constructor in the mainwindow class.<br>
<br>
</div>I don&#39;t know why, but I am suspicious that you have made the QAction&#39;s<br>
parent be the QMenu; I would try making the QAction&#39;s parent the QWidget<br>
the QMenu is associated with (e.g., the Notebook if you change it to be<br>
a QWidget or self._container otherwise).<br>
<br>
Good luck!<br>
<div><div class="h5"><br>
--<br>
Mark Summerfield, Qtrac Ltd, <a href="http://www.qtrac.eu" target="_blank">www.qtrac.eu</a><br>
    C++, Python, Qt, PyQt - training and consultancy<br>
        &quot;Advanced Qt Programming&quot; - ISBN 0321635906<br>
</div></div></blockquote></div><br>