函数在 Qt 中无法正常工作

Posted

技术标签:

【中文标题】函数在 Qt 中无法正常工作【英文标题】:function is not working properly in Qt 【发布时间】:2012-08-07 12:24:39 【问题描述】:

我正在制作一个简单的 GUI 程序来更改 android 手机的启动动画,但从过去 4 天开始,我遇到了一个问题,我不知道是什么原因,这是我的代码

void MainWindow::bootanim1()
   
    QProcess rootboot;

    QStringList path6,boottarget;
    path6<<ui->lineEdit_6->text();

    boottarget<<path6<<" /system/media";
    ui->textBrowser->clear();
    ui->textBrowser->setText("Remounting partitions...");
    rootboot.start("bbin\\adb shell su -c \"busybox mount -o remount,rw /system\"");
    rootboot.waitForFinished();
    ui->textBrowser->setText("\nInstalling bootanimation.zip");
    rootboot.start("bbin\\adb push ",boottarget);
    rootboot.waitForFinished();
    ui->textBrowser->setText("\nBootanimation has been changed! Try shutting down your phone to see new bootanimation");

单击按钮时会启动此功能,但我的问题是,这不起作用!其次,您可以在代码中看到更多信息,我使用textBrowser 向用户显示正在发生的事情,例如重新安装分区等,lineEdit_6lineEdit 小部件,用户将在其中粘贴引导动画的路径。压缩。所以我的问题是当我点击按钮时只显示这个

Bootanimation has been changed! Try shutting down your phone to see new bootanimation

我认为上面的所有内容都被跳过了,我不知道为什么?谁能给我一些关于我缺少什么的提示?

【问题讨论】:

这不是“被跳过”,这是肯定的。 那么你怎么看,为什么它不起作用?我的 bootanimation 没有被替换。为什么?有什么解释吗? 【参考方案1】:

您在这里混合了两种不同的方法来为 QProcess 提供参数:

boottarget<<path6<<" /system/media";
rootboot.start("bbin\\adb push ",boottarget);

First method 在一个 QString 中给出程序名称和参数。

Second method 在 QStringList 中给出参数。

您试图在程序名称字符串中给出一个参数(“push”)。当其他参数在 QStringList 中给出时,它不起作用。最后一个参数在开头也包含可疑的空间,虽然我不知道它是否会导致问题。试试这个:

QStringList args;
args << "push" << path6 << "/system/media";
rootboot.start("bbin\\adb", args);

而 path6 变量可能应该是 QString 而不是 QStringList。

【讨论】:

天啊!!!!!!这确实有效!!!!真的非常感谢,你让我很开心。但是还有一个小问题,我仍然在 textBrowser 中收到“Bootanimation 已更改!尝试关闭手机以查看新的 bootanimation”,并且没有显示所有“Remounting Partition”和其他文本信息内容,但令人高兴的部分就是,这次 bootanimation 被替换了。谢谢!。你对文字部分有什么想法吗? Kamil Klimek 关于事件循环的回答是正确的答案。我不了解 Android,但我猜这些命令行的执行速度如此之快,以至于您无论如何都没有时间查看消息,因为您要替换整个文本而不是仅添加一些新文本。可能您还应该检查 start() 函数的返回值,以便检测执行的命令是否有任何问题。 哦,我不知道每次我使用 ui->textBrowser->setText("My Text");之前的文字被清除。那么如何在不清除前一行的情况下抛出文本,以便稍后我可以使用 ui->textBrowser->clear(); 手动清除它 ui-&gt;textBrowser-&gt;append("Installing bootanimation.zip"); 非常感谢!现在一切都很好!你们真的很摇滚!!【参考方案2】:

UI 需要事件循环来刷新自己。当您在一个函数调用中进行所有更改时,只会更改内部属性,并且 gui 本身不会重新绘制。在每个ui-&gt;textBrowser-&gt;setText(...); 之后使用QCoreApplication::processEvents();

【讨论】:

更好的是,而不是waitForFinished()connect() finished() 向具有其余逻辑的函数发出信号。 好吧,你的意思是说必要的操作和命令都执行成功了对吧?那为什么我的启动动画没有改变? 我没有说所有进程都启动成功了。刚才说了ui需要处理一些事件才能改变。您必须付出一些努力来检查您的流程为什么不起作用。您应该检查来自 QProcess 的错误代码并从进程本身退出代码。阅读 QProcess 文档

以上是关于函数在 Qt 中无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

Qt/QML SwipeDelegate 在移动设备(Android、iOS)上无法正常工作

Qt QToolBar 无法正常工作

Qt QOpenGLWidget glClearColor 无法正常工作

Qt 5.3 QSystemTrayIcon 无法正常工作[Linux]

使用 macdeployqt 构建 QSqlDatabase 的 Qt 应用程序无法正常工作

Qt rand() 无法正常工作