首页 > 解决方案 > 获得焦点后选择所有内容

问题描述

我有以下问题,我有一个 QTableWidget,我向其中添加了一些 QDoubleSpinBox 到一些单元格,到目前为止一切都很好,我的问题是如何在更改焦点时选择旋转框的所有内容,我的意思是当按下键选项卡,当他们获得焦点时,我将不胜感激任何建议。

我留下我的代码:

void MainClass::setData(double val1, double val2,int _rowCount)
{

  for (int i=0;i<= _rowCount; i++) {
      int rowCount=ui->tableWidget_4->rowCount();
      //  ui->tableWidget_4->setRowCount(rowCount);
      //primera columna
      ui->tableWidget_4->insertRow(rowCount);
      //  qDebug()<<rowCount;
      QTableWidgetItem *item=new QTableWidgetItem(QString("v %1").arg(v));
      ui->tableWidget_4->setItem(rowCount,V,item);

      //segunda columna columna
      //  ui->tableWidget_4->insertRow(rowCount);


      QTableWidgetItem *item1=new QTableWidgetItem(0);
      ui->tableWidget_4->setItem(rowCount,Velocidad,item1);
      ui->tableWidget_4->setCellWidget(rowCount,Velocidad,new QDoubleSpinBox);
      QDoubleSpinBox *sb=qobject_cast<QDoubleSpinBox *>(
            ui->tableWidget_4->cellWidget(rowCount,Velocidad));
      sb->setValue(val1);
      //  qDebug()<<item1->data(Qt::DisplayRole).toString();
      //tercera columna columna
      //  ui->tableWidget_4->insertRow(rowCount);
      QTableWidgetItem *item2=new QTableWidgetItem(QString("h %1").arg(h));
      ui->tableWidget_4->setItem(rowCount,H,item2);
      //cuarta columna columna
      //  ui->tableWidget_4->insertRow(rowCount);
      QTableWidgetItem *item3=new QTableWidgetItem(val2);
      ui->tableWidget_4->setItem(rowCount,Profundidad,item3);
      ui->tableWidget_4->setCellWidget(rowCount,Profundidad,new QDoubleSpinBox);
      QDoubleSpinBox *sb2=qobject_cast<QDoubleSpinBox *>(
            ui->tableWidget_4->cellWidget(rowCount,Profundidad));
      sb2->setValue(val2);
      v++;
      h++;
    }

这里的表格

在此处输入图像描述

请注意,当旋转框处于焦点时,只有光标闪烁,但并非所有内容都被选中。

注意:在 setItem 的列号分配中,我使用枚举而不是列号。

枚举 ColNames{V,Velocidad,H,Profundidad};

标签: c++qtqdoublespinbox

解决方案


一种可能的解决方案是覆盖接收焦点时调用的 QDoubleSpinBox 的 focusInEvent 方法,然后选择所有文本。

class DoubleSpinBox: public QDoubleSpinBox{
public:
    using QDoubleSpinBox::QDoubleSpinBox;
protected:
    void focusInEvent(QFocusEvent *event){
        QDoubleSpinBox::focusInEvent(event);
        selectAll();
    }
};

然后使用 setCellWidget 方法设置它。


您还可以避免使用 setCellWidget 方法并使用委托:

#include <QtWidgets>

#include <random>

class Helper: public QObject{
public:
    Helper(QDoubleSpinBox *ds): QObject(ds), m_ds(ds){
        m_ds->installEventFilter(this);
    }
    bool eventFilter(QObject *watched, QEvent *event){
        if(watched == m_ds && event->type() == QEvent::FocusIn){
            m_ds->selectAll();
        }
        return QObject::eventFilter(watched, event);
    }
private:
    QDoubleSpinBox* m_ds;
};

class Delegate: public QStyledItemDelegate{
public:
    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const{
        QWidget *editor = QStyledItemDelegate::createEditor(parent, option, index);
        if(QDoubleSpinBox *ds = qobject_cast<QDoubleSpinBox *>(editor)){
            new Helper(ds);
        }
        return editor;
    }
};

class MainWindow: public QMainWindow{
public:
    MainWindow(QWidget *parent=nullptr):
        QMainWindow(parent), table(new QTableWidget)
    {
        table->setColumnCount(4);
        table->setItemDelegate(new Delegate);
        setCentralWidget(table);
    }
    void append(double value1, double value2){
        int number_of_rows = table->rowCount();
        QTableWidgetItem *item1 = new QTableWidgetItem;
        item1->setText(QString("v %1").arg(number_of_rows));
        QTableWidgetItem *item2 = new QTableWidgetItem;
        item2->setData(Qt::DisplayRole, value1);
        QTableWidgetItem *item3 = new QTableWidgetItem;
        item3->setText(QString("h %1").arg(number_of_rows));
        QTableWidgetItem *item4 = new QTableWidgetItem;
        item4->setData(Qt::DisplayRole, value2);
        table->insertRow(number_of_rows);
        table->setItem(number_of_rows, 0, item1);
        table->setItem(number_of_rows, 1, item2);
        table->setItem(number_of_rows, 2, item3);
        table->setItem(number_of_rows, 3, item4);
        table->openPersistentEditor(item2);
        table->openPersistentEditor(item4);
    }
private:
    QTableWidget *table;
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    a.setStyle("fusion");
    MainWindow w;
    std::uniform_real_distribution<> dist(1.0, 2.0);

    for(int i=0; i< 4; i++){
        double val1 = dist(*QRandomGenerator::global());
        double val2 = dist(*QRandomGenerator::global());
        w.append(val1, val2);
    }
    w.resize(640, 480);
    w.show();
    return a.exec();
}

推荐阅读