1.QTableWidget的closable,2.pro/build_pass,3.QString&&

1.QTableWidget的closable

#include "tabwidgetforaddorremove.h"
#include <QTableWidgetItem>
#include <QtDebug>
#include <QFile>
#include <QPushButton>
#include <QHeaderView>
#include <QScrollBar>

TabWidgetForAddOrRemove::TabWidgetForAddOrRemove(QWidget *parent /*= 0*/)
    : lds_tablewidget(parent)
{
    button_xoff = 2;
    //
    connect(horizontalHeader(), SIGNAL(sectionResized(int, int, int)), this, SLOT(updateHorizontalButtons()));
    connect(horizontalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(updateHorizontalButtons()));

    connect(verticalHeader(), SIGNAL(sectionResized(int, int, int)), this, SLOT(updateVerticalButtons()));
    connect(verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(updateVerticalButtons()));
}

void TabWidgetForAddOrRemove::horizontalFillButton()
{
    for(int k = 0; k < columnCount(); k ++) {
        QTableWidgetItem *item = horizontalHeaderItem(k);
        if(item == 0) {
            item = new QTableWidgetItem;
            setHorizontalHeaderItem(k, item);
        }
        if (k == this->columnCount() - 1)
            item->setIcon(QIcon(":/add.png"));//add
        else
            item->setIcon(QIcon(":/remove.png"));//remove
        if(item->text() == "")
            item->setText("點擊修改");
    }
    updateHorizontalButtons();
}

void TabWidgetForAddOrRemove::verticalFillButton()
{
    for(int k = 0; k < rowCount(); k ++) {
        QTableWidgetItem *item = verticalHeaderItem(k);
        if(item == 0) {
            item = new QTableWidgetItem;
            setVerticalHeaderItem(k, item);
        }
        if (k == this->rowCount() - 1)
            item->setIcon(QIcon(":/add.png"));//add
        else
            item->setIcon(QIcon(":/remove.png"));//remove
        if(item->text() == "")
            item->setText("點擊修改");
    }
    updateVerticalButtons();
}

void TabWidgetForAddOrRemove::insertRowAndFill(int row)
{
    QTableWidgetItem *item;
    this->insertRow(row);
    for (int column = 0; column < this->columnCount(); column++) {
        this->setItem(row, column, new QTableWidgetItem);
    }
    this->setVerticalHeaderItem(row, item = new QTableWidgetItem);
    if (row == this->rowCount() - 1)
        item->setIcon(QIcon(":/add.png"));//add
    else
        item->setIcon(QIcon(":/remove.png"));//remove
    item->setText("點擊修改");
    updateVerticalButtons();
}

void TabWidgetForAddOrRemove::insertColumnAndFill(int column)
{
    QTableWidgetItem *item;
    this->insertColumn(column);
    for (int row = 0; row < this->rowCount(); row++) {
        this->setItem(row, column, new QTableWidgetItem);
    }
    this->setHorizontalHeaderItem(column, item = new QTableWidgetItem);
    if (column == this->columnCount() - 1)
        item->setIcon(QIcon(":/add.png"));//add
    else
        item->setIcon(QIcon(":/remove.png"));//remove

    item->setText("點擊修改");
    updateHorizontalButtons();
}

void TabWidgetForAddOrRemove::setButtonXoff(int button_xoff)
{
    this->button_xoff = button_xoff;
    updateVerticalButtons();
    updateHorizontalButtons();
}

void TabWidgetForAddOrRemove::removeButtonColumn()
{
    QPushButton *b = qobject_cast<QPushButton *>(this->sender());
    if (b == 0)
        return;
    int column = this->horizontalHeader()->logicalIndexAt(b->geometry().center());
    if (column == this->columnCount() - 1)
    {
        insertColumnAndFill(column);
    }
    else
    {
        buttonsMap.remove(this->horizontalHeaderItem(column));
        this->removeColumn(column);
    }
    updateHorizontalButtons();
}

void TabWidgetForAddOrRemove::removeButtonRow()
{
    QPushButton *b = qobject_cast<QPushButton *>(this->sender());
    if (b == 0)
        return;
    int row = this->verticalHeader()->logicalIndexAt(b->geometry().center());
    if (row == this->rowCount() - 1)
    {
        insertRowAndFill(row);
    }
    else
    {
        buttonsMap.remove(this->verticalHeaderItem(row));
        this->removeRow(row);
    }
    updateVerticalButtons();
}

void TabWidgetForAddOrRemove::updateHorizontalButtons()
{
    for (int column = 0; column < this->columnCount(); column++) {
        QTableWidgetItem *item = this->horizontalHeaderItem(column);
        QPushButton *b = buttonsMap.value(item, 0);
        if(item->icon().isNull())
            continue;
        if (0 == b) {
            b = new QPushButton(this->horizontalHeader());
            buttonsMap[this->horizontalHeaderItem(column)] = b;
            b->setFlat(true);
            connect(b, SIGNAL(clicked()), this, SLOT(removeButtonColumn()));
            b->show();
        }
        if (b->isVisibleTo(this)) {
            b->setGeometry(QStyle::alignedRect(Qt::LeftToRight, Qt::AlignVCenter | Qt::AlignLeft, QSize(20, 20), QRect(
                                                   button_xoff + this->horizontalHeader()->sectionViewportPosition(column),
                                                   0,
                                                   this->horizontalHeader()->sectionSize(column),
                                                   this->horizontalHeader()->sizeHint().height())));
        }
    }
}

void TabWidgetForAddOrRemove::updateVerticalButtons()
{
    for (int row = 0; row < this->rowCount(); row++) {
        QTableWidgetItem *item = this->verticalHeaderItem(row);
        if(item == 0)
            continue;
        if(item->icon().isNull())
            continue;
        QPushButton *b = buttonsMap.value(item, 0);
        if (0 == b) {
            b = new QPushButton(this->verticalHeader());
            buttonsMap[this->verticalHeaderItem(row)] = b;
            b->setFlat(true);
            connect(b, SIGNAL(clicked()), this, SLOT(removeButtonRow()));
            b->show();
        }
        if (b->isVisibleTo(this)) {
            b->setGeometry(QStyle::alignedRect(Qt::LeftToRight, Qt::AlignVCenter | Qt::AlignLeft, QSize(20, 20), QRect(
                                                   button_xoff,
                                                   this->verticalHeader()->sectionViewportPosition(row),
                                                   this->verticalHeader()->sizeHint().width(),
                                                   this->verticalHeader()->sectionSize(row))));
        }
    }
}

2.pro/build_pass

1.在qt creator默認的編譯時,會生兩個makefile,對應的release和debug

pro裏的message會執行兩遍

加了build_pass會編譯一次

即:當程序第一次編譯時,build_pass爲false,第二次編譯時爲true

3.QString&&

之前A&a = 1;是違法的,導致qt很多引用穿int,""等值時必須,print(const A &a);現在可以用print(A&&a)了

例如:QString && A = "123";

由於源對象是一個右值,不會再被使用

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章