用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));*/
}
整体界面

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值