QT中用tableWidget实现冻结前两列(菜鸟第一次发帖)

OldTury 2016-01-08 08:50:16
我是照着QT给的例子来弄得,例子用tableView,我照着弄,不过出现了一些问题,我怎么都想不懂。

图片那样子,滚动的时候不同步。
还有创建的表不跟第一个表等大。

QModelIndex Widget::moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers)
{
QModelIndex current = QTableWidget::moveCursor(cursorAction, modifiers);

if(cursorAction == MoveLeft && current.column() > 0
&& ui->tableWidget->visualRect(current).topLeft().x() < tableWidget1->columnWidth(0))
{
const int newValue = ui->tableWidget->horizontalScrollBar()->value() + ui->tableWidget->visualRect(current).topLeft().x()
- tableWidget1->columnWidth(0)- tableWidget1->columnWidth(1) ;
ui->tableWidget->horizontalScrollBar()->setValue(newValue);
// tableWidget1->horizontalScrollBar()->setValue(newValue);
}
qDebug()<<"dd";
return current;
}
对比了例子,好像这个函数在我的工程没有进入。


connect(tableWidget1->verticalScrollBar(), SIGNAL(valueChanged(int)),
ui->tableWidget->verticalScrollBar(), SLOT(setValue(int)));
connect(ui->tableWidget->verticalScrollBar(), SIGNAL(valueChanged(int)),
tableWidget1->verticalScrollBar(), SLOT(setValue(int)));
用这个connect来实现两个表滚动同步的,不过它不同步呢。

表我都是在构造函数直接用setItem创建的。


Widget::Widget(QTableWidget *parent) :
QTableWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
ui->tableWidget->setRowCount(10); //设置行数为10
ui->tableWidget->setColumnCount(50); //设置列数为5
// ui->tableWidget->setWindowTitle("QTableWidget & Item");
ui->tableWidget->resize(560, 250); //设置表格
QStringList header;
header<<"Month"<<"Description";
ui->tableWidget->setHorizontalHeaderLabels(header);
ui->tableWidget->setItem(0,0,new QTableWidgetItem("Jan"));
ui->tableWidget->setItem(1,0,new QTableWidgetItem("Feb"));
ui->tableWidget->setItem(2,0,new QTableWidgetItem("Mar"));

ui->tableWidget->setItem(0,1,new QTableWidgetItem(QIcon("images/IED.png"), "Jan's month"));
ui->tableWidget->setItem(1,1,new QTableWidgetItem(QIcon("images/IED.png"), "Feb's month"));
ui->tableWidget->setItem(2,1,new QTableWidgetItem(QIcon("images/IED.png"), "Mar's month"));
// ui->tableWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);

//初始化冰冻的那个表
tableWidget1 = new QTableWidget(ui->tableWidget);
tableWidget1->setRowCount(10); //设置行数为10
tableWidget1->setColumnCount(50); //设置列数为5
// tableWidget1->setWindowTitle("QTableWidget & Item");
tableWidget1->resize(560, 250); //设置表格
tableWidget1->setHorizontalHeaderLabels(header);
tableWidget1->setItem(0,0,new QTableWidgetItem("Jan"));
tableWidget1->setItem(1,0,new QTableWidgetItem("Feb"));
tableWidget1->setItem(2,0,new QTableWidgetItem("Mar"));

tableWidget1->setItem(0,1,new QTableWidgetItem(QIcon("images/IED.png"), "Jan's month"));
tableWidget1->setItem(1,1,new QTableWidgetItem(QIcon("images/IED.png"), "Feb's month"));
tableWidget1->setItem(2,1,new QTableWidgetItem(QIcon("images/IED.png"), "Mar's month"));

tableWidget1->setFocusPolicy(Qt::NoFocus);
tableWidget1->verticalHeader()->hide();
tableWidget1->horizontalHeader()->setSectionResizeMode(QHeaderView::Fixed);
ui->tableWidget->viewport()->stackUnder(tableWidget1);
tableWidget1->setSelectionModel(ui->tableWidget->selectionModel());

for(int col = 2; col <50; ++col)
{
tableWidget1->setColumnHidden(col, true);
}
tableWidget1->setColumnWidth(0, ui->tableWidget->columnWidth(0));
tableWidget1->setColumnWidth(1, ui->tableWidget->columnWidth(1));

tableWidget1->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
tableWidget1->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
tableWidget1->show();

updateFrozenTableGeometry();
setHorizontalScrollMode(ScrollPerPixel);
setVerticalScrollMode(ScrollPerPixel);
tableWidget1->setVerticalScrollMode(ScrollPerPixel);



connect(ui->tableWidget->horizontalHeader(),SIGNAL(sectionResized(int,int,int)), this,
SLOT(updateSectionWidth(int,int,int)));
connect(ui->tableWidget->verticalHeader(),SIGNAL(sectionResized(int,int,int)), this,
SLOT(updateSectionHeight(int,int,int)));


connect(tableWidget1->verticalScrollBar(), SIGNAL(valueChanged(int)),
ui->tableWidget->verticalScrollBar(), SLOT(setValue(int)));
connect(ui->tableWidget->verticalScrollBar(), SIGNAL(valueChanged(int)),
tableWidget1->verticalScrollBar(), SLOT(setValue(int)));

}
上面的是我的构造函数。
要求是一定要手动拖入tableWidget来实现冻结。
麻烦大神帮我看看哦,第一次发帖,拜托拜托,感激不尽。。
...全文
3603 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
芸编蕴香 2019-10-10
  • 打赏
  • 举报
回复
题主解决了嘛
OldTury 2016-01-08
  • 打赏
  • 举报
回复
#include "widget.h"
#include "ui_widget.h"
#include <QScrollBar>
#include <QHeaderView>
#include<QAbstractItemView>
#include<QDebug>

Widget::Widget(QTableWidget *parent) :
    QTableWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    ui->tableWidget->setRowCount(10); //设置行数为10
    ui->tableWidget->setColumnCount(50); //设置列数为5
 //   ui->tableWidget->setWindowTitle("QTableWidget & Item");
    ui->tableWidget->resize(560, 250);  //设置表格
    QStringList header;
    header<<"Month"<<"Description";
    ui->tableWidget->setHorizontalHeaderLabels(header);
    ui->tableWidget->setItem(0,0,new QTableWidgetItem("Jan"));
    ui->tableWidget->setItem(1,0,new QTableWidgetItem("Feb"));
    ui->tableWidget->setItem(2,0,new QTableWidgetItem("Mar"));

    ui->tableWidget->setItem(0,1,new QTableWidgetItem(QIcon("images/IED.png"), "Jan's month"));
    ui->tableWidget->setItem(1,1,new QTableWidgetItem(QIcon("images/IED.png"), "Feb's month"));
    ui->tableWidget->setItem(2,1,new QTableWidgetItem(QIcon("images/IED.png"), "Mar's month"));
   // ui->tableWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);

    //初始化冰冻的那个表
    tableWidget1 = new QTableWidget(ui->tableWidget);
    tableWidget1->setRowCount(10); //设置行数为10
    tableWidget1->setColumnCount(50); //设置列数为5
    tableWidget1->setHorizontalHeaderLabels(header);
    tableWidget1->setItem(0,0,new QTableWidgetItem("Jan"));
    tableWidget1->setItem(1,0,new QTableWidgetItem("Feb"));
    tableWidget1->setItem(2,0,new QTableWidgetItem("Mar"));
    tableWidget1->setItem(3,0,new QTableWidgetItem("Mar"));

    tableWidget1->setItem(0,1,new QTableWidgetItem(QIcon("images/IED.png"), "Jan's month"));
    tableWidget1->setItem(1,1,new QTableWidgetItem(QIcon("images/IED.png"), "Feb's month"));
    tableWidget1->setItem(2,1,new QTableWidgetItem(QIcon("images/IED.png"), "Mar's month"));

    tableWidget1->setFocusPolicy(Qt::NoFocus);
    tableWidget1->verticalHeader()->hide();
    tableWidget1->horizontalHeader()->setSectionResizeMode(QHeaderView::Fixed);
    ui->tableWidget->viewport()->stackUnder(tableWidget1);
    tableWidget1->setSelectionModel(ui->tableWidget->selectionModel());

    for(int col = 2; col <50; ++col)
    {
        tableWidget1->setColumnHidden(col, true);
    }
    tableWidget1->setColumnWidth(0, ui->tableWidget->columnWidth(0));
    tableWidget1->setColumnWidth(1, ui->tableWidget->columnWidth(1));

    tableWidget1->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    tableWidget1->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
   updateFrozenTableGeometry();
    tableWidget1->show();
  //  updateFrozenTableGeometry();

    setHorizontalScrollMode(ScrollPerPixel);
    setVerticalScrollMode(ScrollPerPixel);
    tableWidget1->setVerticalScrollMode(ScrollPerPixel);



        connect(ui->tableWidget->horizontalHeader(),SIGNAL(sectionResized(int,int,int)), this,
            SLOT(updateSectionWidth(int,int,int)));
        connect(ui->tableWidget->verticalHeader(),SIGNAL(sectionResized(int,int,int)), this,
            SLOT(updateSectionHeight(int,int,int)));

         //实现滑块同步的程序
        connect(tableWidget1->verticalScrollBar(), SIGNAL(valueChanged(int)),
                ui->tableWidget->verticalScrollBar(), SLOT(setValue(int)));
        connect(ui->tableWidget->verticalScrollBar(), SIGNAL(valueChanged(int)),
                tableWidget1->verticalScrollBar(), SLOT(setValue(int)));

}

Widget::~Widget()
{
    delete ui;
    delete tableWidget1;
}



void Widget::updateSectionWidth(int logicalIndex, int /* oldSize */, int newSize)
{
    if(logicalIndex == 0)
{
        tableWidget1->setColumnWidth(0, newSize);
      //  tableWidget1->setColumnWidth(1, newSize);
        updateFrozenTableGeometry();
}
    if(logicalIndex == 1)
    {
        //tableWidget1->setColumnWidth(0, newSize);
        tableWidget1->setColumnWidth(1, newSize);
        updateFrozenTableGeometry();
    }

    qDebug()<<"bb";

}



void Widget::updateSectionHeight(int logicalIndex, int /* oldSize */, int newSize)
{
    tableWidget1->setRowHeight(logicalIndex, newSize);
    updateFrozenTableGeometry();
    qDebug()<<"cc";
}


void Widget::resizeEvent(QResizeEvent * event)
{
    QTableWidget::resizeEvent(event);
    updateFrozenTableGeometry();
    qDebug()<<"aa";
}

//这个函数没有进入
QModelIndex Widget::moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers)
{
    QModelIndex current = QTableWidget::moveCursor(cursorAction, modifiers);

    if(cursorAction == MoveLeft && current.column() > 0
            && ui->tableWidget->visualRect(current).topLeft().x() < tableWidget1->columnWidth(0))
    {
        const int newValue = ui->tableWidget->horizontalScrollBar()->value() + ui->tableWidget->visualRect(current).topLeft().x()
                            - tableWidget1->columnWidth(0)- tableWidget1->columnWidth(1) ;
        ui->tableWidget->horizontalScrollBar()->setValue(newValue);
       // tableWidget1->horizontalScrollBar()->setValue(newValue);
    }
    qDebug()<<"dd";
    return current;
}

//这个不知道为什么也没有进入
void Widget::scrollTo(const QModelIndex &index, ScrollHint hint)
{
    if(index.column() > 0)
        QTableWidget::scrollTo(index, hint);
    qDebug()<<"ee";
}

void Widget::updateFrozenTableGeometry()
{

    tableWidget1->setGeometry(ui->tableWidget->verticalHeader()->width() + ui->tableWidget->frameWidth(),
                              ui->tableWidget->frameWidth(), ui->tableWidget->columnWidth(0)+ui->tableWidget->columnWidth(1),
                              ui->tableWidget->viewport()->height()+ui->tableWidget->horizontalHeader()->height());
    //qDebug()<<"aa";
}

这个是源程序
OldTury 2016-01-08
  • 打赏
  • 举报
回复
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include<QTableWidget>

namespace Ui {
class Widget;
}

class Widget : public QTableWidget
{
    Q_OBJECT
    
public:
    explicit Widget(QTableWidget *parent = 0);
    ~Widget();
    
private:
    Ui::Widget *ui;
   // void init();
    void updateFrozenTableGeometry();
    QTableWidget * tableWidget1;

protected:
    virtual void resizeEvent(QResizeEvent *event);
    virtual QModelIndex moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers);
    void scrollTo (const QModelIndex & index, ScrollHint hint = EnsureVisible);

private slots:
      void updateSectionWidth(int logicalIndex, int oldSize, int newSize);
      void updateSectionHeight(int logicalIndex, int oldSize, int newSize);
};

#endif // WIDGET_H
OldTury 2016-01-08
  • 打赏
  • 举报
回复
我拖动那个表,它就正常大小了。
void Widget::updateFrozenTableGeometry()
{

    tableWidget1->setGeometry(ui->tableWidget->verticalHeader()->width() + ui->tableWidget->frameWidth(),
                              ui->tableWidget->frameWidth(), ui->tableWidget->columnWidth(0)+ui->tableWidget->columnWidth(1),
                              ui->tableWidget->viewport()->height()+ui->tableWidget->horizontalHeader()->height());
    //qDebug()<<"aa";
}
这是设置它大小的函数,应该是没什么问题,只不过不知道为什么不能初始化的时候就设置一样大小。 那个滑块滑动的时候不知道为什么不能同步。
Pokeeeer 2016-01-08
  • 打赏
  • 举报
回复
把每一个行列大小写死,不可缩放试试

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧