Qt判断当前操作系统?
可使用宏判断,例如:
#ifdef Q_OS_MAC //mac
...
#endif
#ifdef Q_OS_LINUX //linux
...
#endif
#ifdef Q_OS_WIN32 //win
...
#endif
#ifdef __arm__ //arm
...
#endif
Qt获取屏幕分辨率?
#include <QDesktopWidget>
//获取设备屏幕大小
QRect screenRect = QApplication::desktop()->screenGeometry();
qDebug() << "设备屏幕分辨率: " << screenRect.width() <<" " << screenRect.height();
Qt实现应用程序关闭和重启?
//关机按钮-点击槽函数
void SystemD::on_shutdownButton_clicked()
{
//关闭应用程序
QCoreApplication::exit();
}
//重启按钮-点击槽函数
void SystemD::on_rebootButton_clicked()
{
//重启应用程序
qApp->quit();
QProcess::startDetached(qApp->applicationFilePath(), QStringList());
}
Qt实现Linux下的系统关机和重启?
先使Linux的普通用户可以在不输入密码的情况下,执行sudo reboot命令实现重启,具体步骤可以参考我的另一篇博客 - Linux常见问题及解决方案 的第13小结。
//关机按钮-点击槽函数
void SystemD::on_shutdownButton_clicked()
{
QProcess::execute("sudo halt"); //UBuntu下执行关机命令(需要root权限)
}
//重启按钮-点击槽函数
void SystemD::on_rebootButton_clicked()
{
QProcess::execute("sudo reboot"); //UBuntu下执行重启命令(需要root权限)
}
Qt B窗口按钮点击时,通知A窗口?
方法一
在B窗口里定义一个signal,点击按钮就emit这个signal;在A窗口里增加一个slot用于接收这个signal,连接信号槽。示例如下(Widget_Prompt为A窗口,SystemD为B窗口):
Widget_Prompt.h
private slots:
void test();
signals:
void haltSignal(); //关机信号
Widget_Prompt.cpp
void Widget_Prompt::on_okButton_clicked()
{
emit haltSignal();
}
SystemD.cpp
Widget_Prompt *promptWin = new Widget_Prompt(this);
connect(promptWin,SIGNAL(haltSignal()),this,SLOT(test()));
void SystemD::test()
{
qDebug() << "test" << endl;
}
方法二
使用 QSignalMapper 信号转发器。
适用范围
简单的理解,可以把SignalMapper这个类看成是信号的翻译和转发器, 它可以把一个无参数的信号翻译成带int参数、QString参数、QObject参数或者QWidget参数的信号, 并将之转发。 这么一说大家有没有联想到该类的适用范围呢? 比如说:我有一堆的button, 可以把clicked事件放在一个函数里处理, 只要给button编个号或者给button起个名就行了, 这样就不用给每个button写一个slot了,岂不是很方便?
使用方法
- 首先把原始的信号连接到QSignalMapper类的map() 槽函数, 这样QSignalMapper能在第一时间接收到原始信号;
- 其次调用setMapping方法建立映射关系,告诉QSignalMapper对象怎样去处理原始信号。(映射关系通过对应一个整数、字符串或者QWidget* 实现)
- 最后通过接收QSignalMapper类转化后的带参信号mapped() 与槽函数连接,在槽函数中获得需要的数据,并作出对应的处理。映射的关系可以通过removeMappings() 被移除。
示例如下:
SystemD.cpp
SystemD::SystemD(QWidget *parent) :
QDialog(parent),
ui(new Ui::SystemD)
{
ui->setupUi(this);
Widget_Prompt *promptWin= new Widget_Prompt(this);
QSignalMapper *signalMapper = new QSignalMapper(this);
//关机按钮点击信号和QSignalMapper类的map()槽函数关联,"关机按钮"字符串作为实参传递
connect(ui->shutdownButton, SIGNAL(clicked()), signalMapper, SLOT(map()));
signalMapper->setMapping(ui->shutdownButton, "关机按钮");
//重启按钮点击信号和QSignalMapper类的map()槽函数关联,"重启按钮"字符串作为实参传递
connect(ui->rebootButton, SIGNAL(clicked()), signalMapper, SLOT(map()));
signalMapper->setMapping(ui->rebootButton, "重启按钮");
//将转发的信号连接到最终的槽函数
connect(signalMapper, SIGNAL(mapped(QString)), promptWin, SLOT(test(QString)));
}
//关机按钮-点击槽函数
void SystemD::on_shutdownButton_clicked()
{
promptWin->setTitle21Info("警告","是否确定关机?");
promptWin->show();
}
//重启按钮-点击槽函数
void SystemD::on_rebootButton_clicked()
{
promptWin->setTitle21Info("警告","是否确定重启?");
promptWin->show();
}
Widget_Prompt.cpp
void Widget_Prompt::on_okButton_clicked()
{
if(m_str == "关机按钮")
{
qDebug() << "关机按钮" << endl;
}
else if(m_str == "重启按钮")
{
qDebug() << "重启按钮" << endl;
}
this->hide(); //确认按钮按下后,关闭窗口
}
void Widget_Prompt::test(QString text)
{
m_str = text;
}
让QT 程序休眠一段时间的方法
在Qt程序中,我们有时候会遇到这样的需求,比如让程序暂停(休息、休眠)一段时间。这里介绍以下几种方法:
一、阻塞型延时
阻塞的原理就是:在延时期间,本线程的事件循环得不到执行。
1、QThread类的sleep()
最简单的延时方法就是使用QThread类的sleep(n)、msleep(n)、usleep(n),这几个函数的不良后果就是,GUI会在延时的时间段内失去响应,界面卡死,所以,这三个函数一般只用在非GUI线程中。
QThread::sleep(5000);
2、使用定时器:死等
QTime timer = QTime::currentTime().addMSecs(5000);
while( QTime::currentTime() < timer ); //等待时间流逝5秒钟
这样做会存在一个问题,当在死循环的时候,我们的界面是无法刷新,用户是不会响应用户的任何交互的。也就是让用户感觉程序已经是假死状态了。
二、非阻塞延时
原理无非就是利用事件循环,有两种原理:
1、处理本线程的事件循环
在等待中,不断强制进入当前线程的事件循环,这样可以把堵塞的事件都处理掉,从而避免程序卡死。
QTime timer = QTime::currentTime().addMSecs(5000);
while( QTime::currentTime() < timer );
QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
QCoreApplication::processEvents(QEventLoop::AllEvents, 100);这条语句能够使程序在while等待期间,去处理一下本线程的事件循环,处理事件循环最多100ms必须返回本语句,如果提前处理完毕,则立即返回这条语句。这也就导致了该Delay_MSec函数的定时误差可能高达100ms。
2、使用子事件循环
创建子事件循环,在子事件循环中,父事件循环仍然是可以执行的。
QEventLoop eventloop;
QTimer::singleShot(5000, &eventloop, SLOT(quit())); //创建单次定时器,槽函数为事件循环的退出函数
eventloop.exec(); //事件循环开始执行,程序会卡在这里,直到定时时间到,本循环被退出
参考:


所有评论(0)