功能介紹
實驗室年會要搞一下抽獎的小程序,我就想能不能用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));*/
}