我正在编写一个Qt Gui,我正在尝试实现一个新功能,我现在想要达到的确切结果,但不是如何编写它。 我正在尝试添加一个可检查按钮,当检查时会运行一个只在取消选中该按钮时停止的功能,但是我在窗口上每秒都会更新一个PaintArea(让我看看我的函数的多次执行情况)正在改变我的数据)。看起来我需要使用一些QThread对象,但只是处理按钮的部分对我来说已经是反直觉了,我一直在尝试使用autoRepeatDelay和autoRepeatInterval来完成他们的工作以及如何处理它们对我有用。
我想我正在尝试编写的内容并不是真正原创的,会想到实现它的步骤,还是代码示例?
编辑: 根据第一个答案(顺便说一句,谢谢他们),我的问题可能并不清楚。把线程放在一边,我想实现一个无限循环,它只在按下按钮进入按下位置(它是一个可检查的按钮)时开始,并且只在离开它时停止。我尝试做的第一个版本(有一段时间(button-> isChecked()循环)将完全冻结,因为应用程序将运行循环,gui将冻结,按钮无法关闭(因此这个想法在一个单独的线程中运行它。。瞧!我希望它是一个更清晰的表述。提前谢谢你。
答案 0 :(得分:1)
我不知道我是否真的明白你想做什么,但我会尽力回答。
首先,你想要一个发送开始和按钮的按钮。停止信息来控制一个线程。您可以使用复选框开始。此复选框在其状态更改时发送信号。将此信号连接到执行启动线程的插槽,并根据发送的布尔值停止。
其次,在你的线程中你需要启动事件循环。之后,设置一个定时器,在每次超时后调用重绘。
希望它有所帮助。
PS:用线程和Qt的对象来处理执行上下文。
答案 1 :(得分:1)
这是一个可能有用的简单骨架。在不知道您的确切要求的情况下,它可能适合您的问题,也可能不适合您。希望它会给你一些实际上有帮助的提示。
void Ui::buttonPressedSlot(bool checked){
if (checked){
Processor *processor = new Processor;
connect(this, SIGNAL(abortCalculations()), processor, SLOT(abort()), Qt::QueuedConnection);
connect(processor, SIGNAL(updateNeeded()), this, SLOT(updateGui()), Qt::QueuedConnection);
QThreadPool::globalInstance()->start(processor);
} else {
emit abortCalculations(); // this is a signal in your UI class
}
}
然后,您可以使用以下内容进行计算。
class Processor : public QObject, public QRunnable{ // QObject must always be first in multiple inheritance
Q_OBJECT
public:
~Processor();
void run();
public slots:
void abort();
void doCalculations();
signals:
void updateNeeded(); // connect this to the GUI to tell it to refresh
private:
QScopedPointer<QEventLoop> loop;
};
Processor::~Processor(){
abort();
}
void Processor::run() {
loop.reset(new QEventLoop);
QTimer timer;
connect(&timer, SIGNAL(timeout()), this, SLOT(doCalculations()));
timer.setInterval(1000);
timer.start();
loop->exec();
}
void Processor::abort(){
if (!loop.isNull()){
loop->quit();
}
}
void Processor::doCalculations(){
// do whatever needs to be done
emit updateNeeded();
}