用QLabel實現抽獎

功能介紹

實驗室年會要搞一下抽獎的小程序,我就想能不能用QT寫一下,主要實現思路是用QLabel來顯示數字,使用一個定時器來實現滾動顯示。雖然不用,但寫一下還是有意思的。

變量定義

class Castle : public QMainWindow
{
	Q_OBJECT
public:
	Castle(QWidget *parent = 0);
	~Castle();
	void InitUI();
	void adjustShowTimer();
private:
	Ui::CastleClass ui;
	QLabel * m_labelSelect; //用來顯示的label
	int m_ipersonNum; //即滾動的數字
	QTimer * m_showTimer; //定時器
	QVector<QString> m_vPerson; //人員列表
	QVector<QPixmap> m_vpImage; //頭像列表
	virtual bool eventFilter(QObject * watched, QEvent * event); //重寫的接收鼠標雙擊事件的函數
	virtual void keyPressEvent(QKeyEvent *ev); //接收按鍵事件的函數
	private slots:
	void onShowTimerOut(); //定時器對應槽函數
};

變量初始化

void Castle::InitUI()
{
	QWidget * ctrWidget = new QWidget(this);
	QHBoxLayout * layout = new QHBoxLayout();
	/*定義label中字體、大小和顏色,並設置居中*/
	m_labelSelect = new QLabel("開始", this);
	//插入自己想設置的字體
	int fontId = QFontDatabase::addApplicationFont("./Resources/方正舒體簡體.ttf");
	QString msyh = QFontDatabase::applicationFontFamilies(fontId).at(0);
	QFont font("FZShuTi-S05S",70,75); 
	QPalette pa;
	pa.setColor(QPalette::WindowText, QColor(0,114,182));
	m_labelSelect->setPalette(pa);
	m_labelSelect->setFont(font);
	m_labelSelect->setFixedSize(this->size());
	//由窗口接管label的事件
	m_labelSelect->installEventFilter(this);
	m_labelSelect->setAlignment(Qt::AlignCenter);

	//由於QMainWindow中不能直接添加Layout,所以將layout依附在一個widget上
	layout->addWidget(m_labelSelect);
	ctrWidget->setLayout(layout);
	this->setCentralWidget(ctrWidget);
	m_showTimer = new QTimer(this);
	m_showTimer->setInterval(1);
	connect(m_showTimer, SIGNAL(timeout()), this, SLOT(onShowTimerOut()));

	//讀取人員列表
	QFile fp("Resources/name.txt");
	if (fp.open(QIODevice::ReadOnly | QIODevice::Text))
	{
		QTextStream in(&fp);
		QString line;
		QStringList nameList;
		while (!in.atEnd())
		{
			line = in.readLine();
			if (line.size()>5)
			{
				nameList = line.split(" ");
				m_vPerson.push_back(nameList[nameList.size()-1]);
			}
		}
	}

	//讀取頭像列表
	QString image_path = "Resources/pic/";
	QDir *dir = new QDir(image_path);
	QStringList fileList = dir->entryList(QDir::Files | QDir::Readable, QDir::Name);
	for (int k = 0; k < fileList.size(); k++)
	{
		QString filename = image_path + fileList.at(k);
		QPixmap image(filename);
		m_vpImage.push_back(image);
	}

}

虛函數重寫

bool Castle::eventFilter(QObject * watched, QEvent * event)
{
	if (watched == m_labelSelect)
	{
		if (event->type() == QEvent::MouseButtonDblClick)
		{
			adjustShowTimer();
		}
	
	}
	return QMainWindow::eventFilter(watched, event);

}


void Castle::keyPressEvent(QKeyEvent *ev)
{
	if (ev->key() == Qt::Key_F5)
	{
		adjustShowTimer();
	}
	else if (ev->key() == Qt::Key_Escape)
	{
		m_labelSelect->setText("開始"); //按Esc復位
	}
}

調整定時器

//如果定時器未激活,則激活,否則停止
void Castle::adjustShowTimer()
{
	if (!m_showTimer->isActive())
	{
		m_showTimer->start();
		qsrand(QTime(0, 0, 0).secsTo(QTime::currentTime()));
		m_ipersonNum = qrand() % m_vPerson.size() + 1;
	}
	else
		m_showTimer->stop();
}

定時器槽函數

void Castle::onShowTimerOut()
{
	m_ipersonNum = m_ipersonNum % m_vPerson.size() + 1;
	//m_labelSelect->setNum(m_ipersonNum);
	m_labelSelect->setText(m_vPerson[m_ipersonNum-1]);
	//還不知道怎麼採集頭像,所以還沒寫
	/*m_ipersonNum = m_ipersonNum % m_vpImage.size() + 1;
	m_labelSelect->setPixmap(m_vpImage.at(m_ipersonNum - 1));*/
}

整體界面

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