捕获QTableView中的单击事件

时间:2014-05-13 18:27:43

标签: qt qt5

以下简要代码中的QObject::connect语句显示

QObject::connect: Incompatible sender/receiver arguments
QTableView::clicked(QModelIndex) --> QTextEdit::setText(QString)

如何从QTableView中的条目中捕获名称(foo,bar)并在相邻窗格的QTextEdit中显示该名称?

#include <QStandardItemModel>
#include <QApplication>
#include <QTableView>
#include <QTextEdit>
#include <QSplitter>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    // Left Pane: Model
    QStandardItemModel * tableModel = new QStandardItemModel(2, 1);
    const char *name[2] = { "foo", "bar" };
    for(int row=0; row<2; ++row) {
        QString namestr = QString("%1").arg(name[row]);
        QStandardItem * item = new QStandardItem(namestr);
        item->setEditable(false);
        tableModel->setItem(row, /*col*/0, item);
    }

    // Left Pane: View
    QTableView * tableView = new QTableView;
    tableView->setModel(tableModel);
    tableView->resizeColumnsToContents();
    tableView->adjustSize();
    tableView->show();

    // Right Pane
    QTextEdit *textEdit = new QTextEdit("Uninitialized");

    QObject::connect(tableView, SIGNAL(clicked(QModelIndex)), textEdit, SLOT(setText(QString)));

    QSplitter splitter;
    splitter.addWidget(tableView);
    splitter.addWidget(textEdit);
    splitter.show();

    return app.exec();
}

另外,我依旧回忆起,在Qt 5.x中可以使用另一种方法(在编译期间进行校对)来处理事件。如果是这样的话,那个成语中的解决方案的暗示会更好。

1 个答案:

答案 0 :(得分:1)

错误信息非常清楚。您无法将信号连接到具有不兼容参数的插槽。您需要在基于QObject的类或非成员函数中创建一个插槽。此函数应具有QModelIndex参数。将QTableView::clicked(QModelIndex)连接到该功能。在该功能中,您可以使用textEdit->setText(index.data().toString());为文本编辑设置新文本。

您需要确保在函数中可以访问textEdit变量,例如如果函数是类成员,则还需要使textEdit成为类成员。使用Qt Creator创建Designer表单类并使用Designer界面在类中创建一个插槽很方便。