C++ Qt 为 QMenu 设置信号和槽

C++ Qt setting up signal and slots for QMenu

我正在尝试制作一个允许用户右键单击 gridView 中的单元格并从操作菜单中进行选择的程序。

我有菜单显示,但我无法让信号和插槽正常工作而不会出现错误。我在 Qt 5.5 C++11 中工作,在 Qt 或 C++ 方面不是很先进,所以任何帮助将不胜感激

using namespace std;
QStandardItemModel* model;
QStandardItem *value;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    model = new QStandardItemModel(9,9,this);

    ui->tableView->setModel(model);
    ui->tableView->setShowGrid(true);
    ui->tableView->setWordWrap(true);
    //to allow menu
    ui->tableView->setContextMenuPolicy(Qt::CustomContextMenu);

for(int row = 0; row < 9; row++){
            ui->tableView->setRowHeight(row, 75);
            for(int col = 0; col < 9; col++){
                ui->tableView->setColumnWidth(col, 75);
                QFont f("Consolas");

                f.setPointSize(10);
                value = new QStandardItem(QString("1 2 3\n4 5 6\n7 8 9"));


                if ((row < 3 && col < 3) || (row > 5 && col < 3)
                        || (row < 3 && col > 5) || (row > 5 && col > 5)
                        || ((row > 2 && row < 6) && (col > 2 && col < 6))){
                    QBrush b(QColor("Moccasin"));
                    value->setBackground(b);
                }

                value->setFont(f);
                value->setTextAlignment(Qt::AlignCenter);
                model->setItem(row,col,value);
            }
        }

        //connects model so functions run when a cell's text is changed
        connect(model, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(on_cell_changed(QStandardItem*)));
        //this sets up the menu
        connect(ui->tableView, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(menuRequest(QPoint)));

    }

这是程序的主要 window 部分。它(将成为)一个数独求解器,因此该模型代表 9x9 网格,for 循环使用输入选项填充网格(但这不是我遇到的问题)。我需要以下菜单部分的帮助(以上仅用于上下文):

void  MainWindow::menuRequest(QPoint pos)
{
    QModelIndex index = ui->tableView->indexAt(pos);
    std::cout << "MainWindow::menuRequest - at" << " QModelIndex row = " <<
                 index.row() << ", column = " << index.column() << std::endl;
    QMenu   menu(this);

    QMenu setValues("Initialize Grid", this);
    QAction *setValue1;
    QAction *setValue2;
    QAction *setValue3;
    QAction *setValue4;
    QAction *setValue5;
    QAction *setValue6;
    QAction *setValue7;
    QAction *setValue8;
    QAction *setValue9;
    setValue1 = setValues.addAction("Set value to 1");
    setValue2 = setValues.addAction("Set value to 2");
    setValue3 = setValues.addAction("Set value to 3");
    setValue4 = setValues.addAction("Set value to 4");
    setValue5 = setValues.addAction("Set value to 5");
    setValue6 = setValues.addAction("Set value to 6");
    setValue7 = setValues.addAction("Set value to 7");
    setValue8 = setValues.addAction("Set value to 8");
    setValue9 = setValues.addAction("Set value to 9");

    connect(menu, SIGNAL(triggered(QAction*)), this, SLOT(on_menu_clicked(QAction*)));

    menu.addMenu(&setValues);
    QAction *action = menu.exec(
                ui->tableView->viewport()->mapToGlobal(pos));

}

void MainWindow::on_menu_clicked(QAction*){
    cout << "test menu click worked";
}

MenuRequest 函数中的连接语句引发错误:

connect(menu, SIGNAL(triggered(QAction*)), this, SLOT(on_menu_clicked(QAction*)));

C2664:'QMetaObject::Connection QObject::connect(const QObject *, const char *, const char *, Qt::ConnectionType)const':无法将参数 1 从 'QMenu' 转换为 'const QObject *'

当它应该转到 on_menu_click 函数时它抛出上述错误

我知道这意味着菜单不是 QObject 类型,但我不确定如何解决这个问题。任何帮助将不胜感激

如评论中所述,您在 connect() 函数中的第一个参数需要是一个指针。文档说明如下:

connect(const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionType type = Qt::AutoConnection)

http://doc.qt.io/qt-5/qobject.html#connect