函数在 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_6
是lineEdit
小部件,用户将在其中粘贴引导动画的路径。压缩。所以我的问题是当我点击按钮时只显示这个
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->textBrowser->append("Installing bootanimation.zip");
非常感谢!现在一切都很好!你们真的很摇滚!!【参考方案2】:
UI 需要事件循环来刷新自己。当您在一个函数调用中进行所有更改时,只会更改内部属性,并且 gui 本身不会重新绘制。在每个ui->textBrowser->setText(...);
之后使用QCoreApplication::processEvents();
【讨论】:
更好的是,而不是waitForFinished()
,connect()
finished()
向具有其余逻辑的函数发出信号。
好吧,你的意思是说必要的操作和命令都执行成功了对吧?那为什么我的启动动画没有改变?
我没有说所有进程都启动成功了。刚才说了ui需要处理一些事件才能改变。您必须付出一些努力来检查您的流程为什么不起作用。您应该检查来自 QProcess 的错误代码并从进程本身退出代码。阅读 QProcess 文档以上是关于函数在 Qt 中无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章
Qt/QML SwipeDelegate 在移动设备(Android、iOS)上无法正常工作
Qt QOpenGLWidget glClearColor 无法正常工作
Qt 5.3 QSystemTrayIcon 无法正常工作[Linux]