QPushButton的Enable和Disable问题

HardEvil 2013-04-06 07:44:39
现在我遇到这样一个问题。我的一个pushbutton关联的函数A中有一个函数B需要运行很长的时间,所以我就开了一个线程让这个函数B跑。这时候我的图形界面就不会卡死。但是,在我函数B跑得时候,我的所有的button必须都disable掉,直到这个函数B跑完再enable,所以我采用了这样一个方式:当开始跑函数A的时候,我把所有buttondisable。当我线程跑完的时候,我发送一个信号,然后将这个信号关联到一个函数C,在这个函数C中我将所有的button都enable。
可是,这样做的效果是button只有很短的时间disable,然后就自动enable了,但是线程用了很久才跑完,不知道怎么回事,求解答。
这是我的mainwindow.cpp:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);

this->_thread = new MyThread();

this->connect(ui->CreateButton, SIGNAL(clicked()), SLOT(onCreate()));
this->connect(this->_thread, SIGNAL(UpdateSignal()), SLOT(updateSlot()));

}
void MainWindow::onCreate()
{
ui->selectButton->setEnabled(false);
ui->CreateButton->setEnabled(false);
ui->ReplaceButton->setEnabled(false);
ui->DeleteButton->setEnabled(false);
cout << "Disabled!" << endl;

this->_thread->start();

}
void MainWindow::updateSlot()
{
ui->selectButton->setEnabled(true);
ui->CreateButton->setEnabled(true);
ui->ReplaceButton->setEnabled(true);
ui->DeleteButton->setEnabled(true);

cout << "Enabled!" << endl;
}


这是我的mythread.cpp:
void MyThread::run()
{

for (int i = 0; i < 40; ++i)
{
for (int j = 0; j < 40; ++j)
{
for (int k = 0; k < 40; ++k)
{
cout << "Start!" << endl;
}
}
}
cout << "Finished!" << endl;
emit this->UpdateSignal();
}
...全文
4424 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
HardEvil 2013-04-06
  • 打赏
  • 举报
回复
引用 5 楼 jdwx1 的回复:
引用 4 楼 u010008236 的回复:引用 2 楼 jdwx1 的回复:是啊,就那几个循环,用不了多少时间。 我这是调小了,只要循环次数大点还是要个好十几秒的,因为要输出到控制台,所以时间会久点。但是,我发现Enabled还没出现就已经Enable了,而且要过好一会儿才出现Enabled 把循环中间的:cout << "Start!" << endl;去掉。 ……
是的,好囧啊,居然是这样。。。谢谢啦
HardEvil 2013-04-06
  • 打赏
  • 举报
回复
引用 楼主 u010008236 的回复:
本帖最后由 u010008236 于 2013-04-06 19:45:51 编辑 现在我遇到这样一个问题。我的一个pushbutton关联的函数A中有一个函数B需要运行很长的时间,所以我就开了一个线程让这个函数B跑。这时候我的图形界面就不会卡死。但是,在我函数B跑得时候,我的所有的button必须都disable掉,直到这个函数B跑完再e……
我就只有这里绑定了signal-slot
jdwx 2013-04-06
  • 打赏
  • 举报
回复
引用 4 楼 u010008236 的回复:
引用 2 楼 jdwx1 的回复:是啊,就那几个循环,用不了多少时间。 我这是调小了,只要循环次数大点还是要个好十几秒的,因为要输出到控制台,所以时间会久点。但是,我发现Enabled还没出现就已经Enable了,而且要过好一会儿才出现Enabled
把循环中间的:cout << "Start!" << endl;去掉。 再看一下,不是循环占用时间太长,而是控制台输出反映迟钝。
HardEvil 2013-04-06
  • 打赏
  • 举报
回复
引用 2 楼 jdwx1 的回复:
是啊,就那几个循环,用不了多少时间。
我这是调小了,只要循环次数大点还是要个好十几秒的,因为要输出到控制台,所以时间会久点。但是,我发现Enabled还没出现就已经Enable了,而且要过好一会儿才出现Enabled
HardEvil 2013-04-06
  • 打赏
  • 举报
回复
引用 楼主 u010008236 的回复:
本帖最后由 u010008236 于 2013-04-06 19:45:51 编辑 现在我遇到这样一个问题。我的一个pushbutton关联的函数A中有一个函数B需要运行很长的时间,所以我就开了一个线程让这个函数B跑。这时候我的图形界面就不会卡死。但是,在我函数B跑得时候,我的所有的button必须都disable掉,直到这个函数B跑完再e……
我这是调小了,只要循环次数大点还是要个好十几秒的,因为要输出到控制台,所以时间会久点。但是,我发现Enabled还没出现就已经Enable了,而且要过好一会儿才出现Enabled
jdwx 2013-04-06
  • 打赏
  • 举报
回复
是啊,就那几个循环,用不了多少时间。
乔巴好萌 2013-04-06
  • 打赏
  • 举报
回复
这个线程很快就能处理完吧,几个for循环,没什么超时操作。 确定只有这一个地方绑定signal-slot进行disable enable操作?

16,224

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧