QTableWidget и QLineEdit — позиция и текстовое содержимое

Мне трудно понять, как получить позицию (столбец и строку) и содержимое в QLineEdit. Я использую eventFilter для получения сигнала, но оттуда я застрял. любой совет? Спасибо

 ui->tableWidget->setRowCount(5);
 ui->tableWidget->setColumnCount(5);

 QStringList wordList;
 wordList << "alpha" << "omega" << "omega2" << "omega3" <<"omicron" << "zeta";

 for(int i = 0; i<5;i++)
 {

 QLineEdit *lineEdit = new QLineEdit;

 QCompleter *completer = new QCompleter(wordList);
 completer->setCaseSensitivity(Qt::CaseInsensitive);
 lineEdit->installEventFilter(this);
 lineEdit->setCompleter(completer);
 ui->tableWidget->setCellWidget(i,i,lineEdit);
 }

 ....

 bool MainWindow::eventFilter(QObject * object, QEvent *event)
 {

  }

Я хотел бы получить позицию, когда закончу редактирование. Я хотел бы выбрать слово из списка с помощью клавиш вверх и вниз или щелчка левой кнопкой мыши. Как только слово будет выбрано, это слово заполнит QLineEdit. Тогда я хотел бы знать позицию. Теперь, если пользователь пишет текст, отличный от содержимого списка, то никакая позиция не должна возвращаться. Меня интересует только то, что находится в «списке слов». Спасибо


person VMI    schedule 18.03.2018    source источник
comment
Когда вы хотите получить строку и столбец, когда вы закончите редактирование?   -  person eyllanesc    schedule 19.03.2018
comment
Эйлланеск: Да, я хотел бы получить эту должность, когда закончу монтаж. Я хотел бы выбрать слово из списка с помощью клавиш вверх и вниз или щелчка левой кнопкой мыши. Как только слово будет выбрано, это слово заполнит QLineEdit. Тогда я хотел бы знать позицию. Спасибо   -  person VMI    schedule 19.03.2018


Ответы (1)


Как вы указываете в своих комментариях, вы хотите получить текст только тогда, когда выбран элемент, установленный в QCompleter, для этого мы должны использовать сигнал void QCompleter::activated(const QString & text).

Для этого создается слот и выполняется подключение:

*.h

private slots:
    void onActivated(const QString &text);

*.cpp

    QCompleter *completer = new QCompleter(wordList);
    ...
    connect(completer, qOverload<const QString &>(&QCompleter::activated), this, &MainWindow::onActivated);

Есть 2 возможных решения:

  • Первым используется положение QLineEdit, которое мы получаем с помощью метода widget() для QCompleter, а QCompleter мы получаем его с помощью sender(), который является объектом, который излучает сигнал, и pos(). затем мы получаем QModelIndex с indexAt(), и это содержит информацию о строке и столбце:

void MainWindow::onActivated(const QString &text)
{
    QCompleter *completer = static_cast<QCompleter *>(sender());
    QModelIndex ix = ui->tableWidget->indexAt(completer->widget()->pos());
    if(ix.isValid()){
        qDebug()<<ix.row()<<ix.column()<<text;
    }
}
  • Или строка и столбец сохраняются как свойство:

    QCompleter *completer = new QCompleter(wordList);
    ...
    completer->setProperty("row", i);
    completer->setProperty("column", i);

void MainWindow::onActivated(const QString &text)
{
    QCompleter *completer = static_cast<QCompleter *>(sender());
    qDebug()<< completer->property("row").toInt()<<completer->property("column").toInt()<<text;    
}

По следующей ссылке вы можете найти оба полных примера

person eyllanesc    schedule 18.03.2018
comment
Эйлланеск: Да, я хотел бы получить эту должность, когда закончу монтаж. Я хотел бы выбрать слово из списка с помощью клавиш вверх и вниз или щелчка левой кнопкой мыши. Как только слово будет выбрано, это слово заполнит QLineEdit. Тогда я хотел бы знать позицию. Спасибо - person VMI; 19.03.2018
comment
@VMI, а что будет, если пользователь напишет текст, отличный от содержимого списка, он должен еще и позицию указать? - person eyllanesc; 19.03.2018
comment
если пользователь пишет текст, отличный от содержимого списка, то никакая позиция не должна возвращаться. Меня интересует только то, что в списке. - person VMI; 19.03.2018
comment
@VMI Отредактируйте свой вопрос и укажите его. - person eyllanesc; 19.03.2018