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(); //事件循环开始执行,程序会卡在这里,直到定时时间到,本循环被退出


参考:

让QT 程序休眠一段时间的方法

QT延时/等待怎么写?阻塞延时/不阻塞延时/耗时代码的处理


转载于:https://www.cnblogs.com/linuxAndMcu/p/11149867.html

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐