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";
由於源對象是一個右值,不會再被使用