Qt / C ++: QTableView contextmenu и прохождение информации - PullRequest
1 голос
/ 05 декабря 2010

Мне нужно контекстное меню для ячеек в моем QTableView, поэтому сначала я подключился:

connect(ui->tblTimesheet,SIGNAL(customContextMenuRequested(QPoint)),this,SLOT(sheetContextMenu(const QPoint &)));

И слот для этого подключения ниже:

void wndMyWindow::sheetContextMenu(const QPoint &pos){
    QMenu *menu = new QMenu;
    QModelIndex cell = ui->tblTimesheet->indexAt(pos);
    // Make sure the right click occured on a cell!
    if(cell.isValid()){
        QString myid=cell.sibling(cell.row(),0).data().toString();
        menu->addAction("Remove item", this, SLOT(sheetRemoveItem()));
        menu->exec(ui->tblTimesheet->mapToGlobal(pos));
    }
}

, который создает менюи помещает действие в меню, которое вызывает функцию при нажатии на это действие.Однако я хочу передать переменную myid во второй слот.Этот слот указан ниже:

void wndMyWindow::sheetRemoveItem(){
    qDebug("Sure I'm here, but what info do I have?");
    return;
}

Я не совсем уверен, как это сделать, кто-нибудь может помочь?

Ответы [ 2 ]

2 голосов
/ 05 декабря 2010

В этом отношении сигналы / слоты Qt отстой по сравнению с обратными вызовами и другими механизмами сигналов / слотов. Вы действительно не можете прикрепить дополнительную информацию.

Пара вещей, которые вы можете сделать, хотя:

  1. Создайте объект, в котором хранится информация, которую вы хотите отправить, дайте ему место и прикрепите к сигналу, на который вы хотите ответить, подайте новый сигнал с информацией, прикрепите к этому сигналу. 1008 *

  2. Используйте штуковину карты сигналов Qt, чтобы прикрепить к сигналу небольшой разброс данных.

  3. Вы можете получить отправителя в слоте Qt. Это может быть информация, которая вам нужна. (смотрите документацию Qt по сигналам / слотам).

Если ни один из этих методов не работает для вас, извините, но вы в значительной степени обескуражены. Я работаю над методом автоматического создания # 1 и присоединения к boost :: signal, который будет более мощным, но он потребует много тяжелой работы, потому что Qt несовместим с препроцессором C ++ и с шаблонами.

Удачи.

1 голос
/ 12 июня 2012

Прочитав предыдущий ответ, я понял, что вы можете прикрепить некоторые данные к отправителю. Я делаю это в своем коде.

Каждый объект, который наследуется от QObject, имеет setProperty (). Здесь вы можете установить некоторые данные, прежде чем он начнет отправлять сигналы. В одном из моих слотов я делаю следующее:

qobject_cast<QAction*>(sender())->property("index").toInt()

Это позволяет мне прикрепить индекс к моему действию.

...