2014-10-12 2 views
-1

Есть N столбцы с ручной шириной изменения слева. Ширины других столбцов изменяются только при изменении размеров столбцов с ручным изменением размера. Мне нужно предотвратить изменение значка курсора, когда курсор находится под границами разделов без ручного изменения размера.Как я могу предотвратить превращение курсора в SplitHCursor, когда он находится под границей между разделами QHeaderView

enter image description here

Что я пытаюсь сделать. Но это не очень хорошо.

table_header_border.zip

#include "mainwindow.h" 
#include "ui_mainwindow.h" 

const int N = 2; 

//============================================================================== 

int nWidth(const QTableWidget *table) 
{ 
    int ret = 0; 

    if (table->verticalHeader()->isVisible()) 
    { 
     ret += table->verticalHeader()->width(); 
    } 

    for (int i = 0; i < N; i++) 
    { 
     ret += table->columnWidth(i); 
    } 

    return ret; 
} 

bool isInNColumns(const QTableWidget *table) 
{ 
    QPoint cursorPos = table->mapFromGlobal(QCursor::pos()); 
    return cursorPos.x() < nWidth(table) + 5; 
} 

//============================================================================== 

class MyHorizontalHeader : public QHeaderView 
{ 
public: 
    MyHorizontalHeader(QWidget *parent=0) : QHeaderView(Qt::Horizontal, parent) 
    { 
     setMouseTracking(true); 
    } 
private slots: 
    void mouseMoveEvent(QMouseEvent *event) 
    { 
     QHeaderView::mouseMoveEvent(event); 
     if (cursor().shape() == Qt::SplitHCursor) 
     { 
      QTableWidget *table = dynamic_cast<QTableWidget *>(parent()); 
      if (table != NULL && !isInNColumns(table)) 
      { 
       qApp->setOverrideCursor(QCursor(Qt::ArrowCursor)); 
       return; 
      } 
      qApp->setOverrideCursor(QCursor(Qt::SplitHCursor)); 
     } 
    } 
}; 

//============================================================================== 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    ui->tableWidget->setHorizontalHeader(new MyHorizontalHeader(this)); 
} 

MainWindow::~MainWindow() 
{ 
    delete ui; 
} 
+1

см: http://stackoverflow.com/help/how-to-ask – Iuliu

+1

Я обновил свой ответ. 'FocusIn' и' FocusOut' не очень подходят, проверьте мое обновление, пожалуйста. – Chernobyl

ответ

0

horizontalHeader() -> setSectionResizeMode (я , QHeaderView: :Исправлена);

1

Вы должны использовать QEvent::Enter и QEvent::Leave для лучшего результата.

Используйте фильтр следующее событие:

В заголовке:

protected: 
    bool eventFilter(QObject *obj, QEvent *event); 

В конструкторе:

qApp->installEventFilter(this); 

EventFilter:

bool MainWindow::eventFilter(QObject *obj, QEvent *event) 
{ 
    if (obj == ui->tableWidget && event->type() == QEvent::Enter) 
    { 
     qApp->setOverrideCursor(QCursor(Qt::ArrowCursor)); 
     //or 
     qApp->setOverrideCursor(ui->tableWidget->cursor()); 
     qDebug() << "added"; 
    } 
    if (obj == ui->tableWidget && event->type() == QEvent::Leave) 
    { 
     qApp->restoreOverrideCursor(); 
    } 
    return QObject::eventFilter(obj, event); 
}