QTableWidget實現【最近打開文件】功能

界面(可以自己另外美化)


主要控件:一個QGroupBox(ui.groupBox)裏包括一個QLabel(ui.label)和一個QListWidget(ui.listWidgetOpenHistory)

初始界面圖:

打開10個文件後:

當我們添加第11個文件(限制顯示10個最近打開文件):

當我們選擇“6”文件,單擊即打開:

部分.h代碼


#include <QSettings>

//最近打開文件結構體
struct OpenHistory{
	int nNumber;
	QString strOpenPath;
};

class MyClass: public QWidget
{
	Q_OBJECT

public:
	MyClass(QWidget *parent = 0);
	~MyClass();
	void updateHistory();					//刷新最近打開listOpenHistory和最近打開控件

private slots :
	void openhistory_click(QListWidgetItem *item);	//打開所選最近打開文件

private:
	void initOpenHistoryWidget();			//初始化最近打開控件
	void updateHistoryWidget();				//刷新最近打開控件

private:
	QSettings *settings;					//環境目錄下的配置OpenHistory.ini
	QList<OpenHistory> listOpenHistory;		//保存打開過的最近10個路徑
};

部分.cpp代碼


MyClass::MyClass(QWidget *parent)
	: QWidget(parent)
{
	ui.setupUi(this);
	ui.label->setFrameStyle(QFrame::Box | QFrame::Raised);		//[最近打開方案:]樣式
        ui.label->setStyleSheet(QLatin1String("background-color:rgb(118, 117, 114);\n"
"color: #fff;"));
	//ui.listWidgetOpenHistory->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);		//隱藏水平滾動條
	QObject::connect(ui.listWidgetOpenHistory, SIGNAL(itemClicked(QListWidgetItem*)), this, SLOT(openhistory_click(QListWidgetItem*)));

        //QSettings保存路徑
	QString strPath = qApp->applicationDirPath() + "/OpenHistory.ini";
	settings = new QSettings(strPath, QSettings::IniFormat);
	initOpenHistoryWidget();
}

MyClass::~MyClass()
{
	if (settings)
	{
		delete settings;
		settings = NULL;
	}
}

void MyClass::initOpenHistoryWidget()
{
	int nSize = settings->beginReadArray("OpenHistorys");
	for (size_t i = 0; i != nSize; ++i)
	{
		settings->setArrayIndex(i);
		OpenHistory HistoryPath;
		HistoryPath.nNumber = settings->value("nNumber").toInt();
		HistoryPath.strOpenPath = settings->value("strOpenPath").toString();
		QFile file(HistoryPath.strOpenPath);
		if (!file.exists())
			continue;
		listOpenHistory.append(HistoryPath);
	}
	settings->endArray();
	updateHistoryWidget();
}

void MyClass::updateHistoryWidget()
{
	ui.listWidgetOpenHistory->clear();
    //如果沒有最近打開文件,隱藏Label和Listwidget
        if (!listOpenHistory.size())
	    {
		ui.groupBox->hide();
		return;
	    }
	else
		ui.groupBox->show();
	for (size_t i = 0; i != listOpenHistory.size(); ++i)
	{
		ui.listWidgetOpenHistory->insertItem(i, listOpenHistory[i].strOpenPath);
		QListWidgetItem *item = ui.listWidgetOpenHistory->item(i);
		if (i % 2 == 0)
			item->setBackgroundColor(QColor(239, 250, 225));
		else
			item->setBackgroundColor(QColor(230, 245, 250));
		//item->setToolTip(listOpenHistory[i].strOpenPath);
	}
	ui.listWidgetOpenHistory->update();
}

void MyClass::updateHistory()
{
	//移除原有當前打開的目錄
	QString dir = 當前文件;//需另外實現
	for (size_t i = 0; i != listOpenHistory.size(); ++i)
	{
		if (!listOpenHistory[i].strOpenPath.compare(dir))
			listOpenHistory.removeAt(i--);
		else
		{
			QFile file(listOpenHistory[i].strOpenPath);
			if (!file.exists())
				listOpenHistory.removeAt(i--);
		}
	}
	//限制顯示目錄數量爲10
	while (listOpenHistory.size() > 9)
		listOpenHistory.removeLast();
	//更新listOpenHistory
	OpenHistory HistoryPath;
	HistoryPath.nNumber = 0;
	HistoryPath.strOpenPath = dir;
	listOpenHistory.push_front(HistoryPath);
	settings->beginWriteArray("OpenHistorys");
	for (size_t i = 0; i < listOpenHistory.size(); ++i)
	{
		settings->setArrayIndex(i);
		settings->setValue("nNumber", i);
		settings->setValue("strOpenPath", listOpenHistory[i].strOpenPath);
	}
	settings->endArray();
	updateHistoryWidget();
}

void MyClass::openhistory_click(QListWidgetItem *item)
{
	QString strSelPath = item->text();
        //打開文件,需另外實現
        。。。
	updateHistory();
}

打開所選文件和記錄當前打開文件需自己另外實現。

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