April 9, 2012

yunier0525 yunier0525
Lab Rat
3 posts

Menu contextual (Context Menu)

 

Estoy tradando de usar un menú contextual personalizado según el elemento en un QTreeWidget. Pero no logro conectar una señal que me daría la salución (pienso yo).

El problema está en que cuando ejecuto el programa, me da el siguiente error/warning
Object::connect: No such slot QTreeWidget::contextMenu(QPoint)

Aqui dejo mi código fuente, para ver si alguno de ustedes me puede ayudar.

  1. #ifndef CUSTOMTREEWIDGET_H
  2. #define CUSTOMTREEWIDGET_H
  3.  
  4. #include <QTreeWidget>
  5.  
  6. class CustomTreeWidget : public QTreeWidget
  7. {
  8. public:
  9.     CustomTreeWidget(QWidget *parent = 0);
  10.     ~CustomTreeWidget();
  11.  
  12. public slots:
  13.     void contextMenu(const QPoint &pos);
  14. };
  15.  
  16. #endif // CUSTOMTREEWIDGET_H
  17.  
  18. #include "customtreewidget.h"
  19. #include "defaulttreeitem.h"
  20.  
  21. /*constructor aqui*/
  22.  
  23. void CustomTreeWidget::contextMenu(const QPoint &pos)
  24. {
  25.     DefaultTreeItem* selected =
  26.             reinterpret_cast<DefaultTreeItem*>(currentItem());
  27.  
  28.     if ( selected != 0 )
  29.         selected->contextMenu(pos);
  30. }
  31.  
  32.  
  33. #ifndef DEFAULTTREEITEM_H
  34. #define DEFAULTTREEITEM_H
  35.  
  36. #include <QTreeWidgetItem>
  37.  
  38. class DefaultTreeItem : public QTreeWidgetItem
  39. {
  40. public:
  41.     explicit DefaultTreeItem(QTreeWidget *view, int type = Type);
  42.     explicit DefaultTreeItem(QTreeWidgetItem *parent, int type = Type);
  43.     ~DefaultTreeItem();
  44.  
  45.     void contextMenu(const QPoint &pos);
  46. };
  47.  
  48. #endif // DEFAULTTREEITEM_H
  49.  
  50.  
  51. #include "defaulttreeitem.h"
  52. #include <QMenu>
  53. #include <QAction>
  54. /*constructor aqui*/
  55.  
  56. void DefaultTreeItem::contextMenu(const QPoint &pos)
  57. {
  58.     // creando el menú contextual
  59.     QMenu* contextMenu = new QMenu();
  60.     QAction *actCustom = new QAction("Custom Action", contextMenu);
  61.     contextMenu->addAction(actCustom);
  62.     contextMenu->exec( pos );
  63.     delete contextMenu;
  64. }
  65.  
  66.  
  67. #ifndef MAINWINDOW_H
  68. #define MAINWINDOW_H
  69.  
  70. #include <QMainWindow>
  71. #include <customtreewidget.h>
  72.  
  73. namespace Ui {
  74.     class MainWindow;
  75. }
  76.  
  77. class MainWindow : public QMainWindow
  78. {
  79.     Q_OBJECT
  80.  
  81. public:
  82.     explicit MainWindow(QWidget *parent = 0);
  83.     ~MainWindow();
  84.  
  85. private:
  86.     Ui::MainWindow *ui;
  87.     CustomTreeWidget * tree;
  88.  
  89. };
  90.  
  91. #endif // MAINWINDOW_H
  92.  
  93.  
  94. #include "mainwindow.h"
  95. #include "ui_mainwindow.h"
  96.  
  97. MainWindow::MainWindow(QWidget *parent) :
  98.     QMainWindow(parent),
  99.     ui(new Ui::MainWindow)
  100. {
  101.     ui->setupUi(this);
  102.  
  103.     this->tree = new CustomTreeWidget(ui->centralWidget);
  104.     this->tree->setContextMenuPolicy(Qt::CustomContextMenu);
  105.  
  106.     connect(this->tree,SIGNAL ( customContextMenuRequested(QPoint) ),
  107.             this->tree,SLOT ( contextMenu(QPoint) ) );
  108. }
  109.  
  110.  
  111. /*....codigo aqui....*/
  112.  
  113. #include <QtGui/QApplication>
  114. #include "mainwindow.h"
  115.  
  116. int main(int argc, char *argv[])
  117. {
  118.     QApplication a(argc, argv);
  119.     MainWindow w;
  120.     w.show();
  121.  
  122.     return a.exec();
  123. }

1 reply

April 9, 2012

mlong mlong
Robot Herder
1551 posts

Necessita usar el macro Q_OBJECT en su customtreewidget.h.

 Signature 

Senior Software Engineer
AccuWeather Enterprise Solutions
/* My views and opinions do not necessarily reflect those of my employer.  Void where prohibited. */

 
  ‹‹ Novato en QT(varias dudas)      Realidad Aumentada ››

You must log in to post a reply. Not a member yet? Register here!