Russian Qt Forum
Сентябрь 30, 2024, 12:28 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: POSIX-потоки и QT-кнопки  (Прочитано 6058 раз)
jacuba
Гость
« : Февраль 25, 2011, 11:53 »

Добрый день,
стоит задача: поменять цвет кнопки в посикс-потоке, есть код:
Код:
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <QApplication>
#include <QFont>
#include <QPushButton>
#include <QWidget>
#include <QStyle>
#include <QToolButton>
#include <QMessageBox>
#include <QVBoxLayout>

QWidget *window;
QPushButton *button2;

void *ColorButton(void *threadid)
{

    button2 = new QPushButton("Button2", window);
    button2->setGeometry(10, 10, 180, 40);
    button2->setStyleSheet(" background-color: green ;border-radius: 8px; border-color: black; border-style: outset; border-width: 2px");
    button2->show();

}

int main(int argc, char *argv[])
{
    pthread_t thread1;

    QApplication app(argc, argv);
    window = new QWidget;
    window->resize(200, 120);

    QPushButton button1("Button1", window);
    button1.setGeometry(10, 10, 180, 40);

    window->show();
    pthread_create(&thread1, NULL, ColorButton, NULL);
    sleep(1);


    return app.exec();
}

Собственно на экране появляется 2 формы, на первой button1 ,на второй button2, необходимо что бы это было на одной форме, прошу помощи в реализации. Заранее спаисбо.

C Cи и Qt общаюсь 2 дня.

« Последнее редактирование: Февраль 25, 2011, 12:24 от jacuba » Записан
bmw
Гость
« Ответ #1 : Февраль 25, 2011, 16:27 »

Сомневаюсь что у вас так получится. Вообще подразумаевается что обращаться к интерфейсу можно только из основного потока.
Я так думаю что и на POSIX потоки это распространяется. Как вариант генерируйте в своём втором потоке сигнал, на который в основном потоке и будет реагировать кнопка.
Записан
Fat-Zer
Гость
« Ответ #2 : Февраль 25, 2011, 16:46 »

весь интерфейс должен быть в одном потоке... и нафига ж тут POSIX потоки пользовать Qt'шные ведь намного симпотичней выглядят!?
Записан
jacuba
Гость
« Ответ #3 : Февраль 28, 2011, 08:17 »

bmw, не мог бы ты показать, как именно мне сгенерировать этот сигнал. Заранее благодарен.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #4 : Февраль 28, 2011, 09:13 »

2 jacuba,

На этом форуме есть специальный раздел с ссылками на необходимую литературу. Не поленись, прочти её! И вопросы такого рода отпадут сами по себе.
Зайди в раздел "Общие вопросы" и там сверху прикреплены соответствующие темы.

ЗЫ: И что ж всем так лень почитать то, а?
Не хочу учиться - а хочу жениться (с) ? Подмигивающий
« Последнее редактирование: Февраль 28, 2011, 09:15 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
jacuba
Гость
« Ответ #5 : Февраль 28, 2011, 10:20 »

Прочитать пару книжек и самостоятельно разобраться с вопросом - это конечно очень хорошо и правильно.

Но передо мной стоят конкретные задачи и отведены конкретные сроки, C и Qt - для меня это абсолютно новое и неизведанное, поэтому и прошу привести подробный пример работы. Заранее благодарен.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #6 : Февраль 28, 2011, 10:22 »

$100
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
jacuba
Гость
« Ответ #7 : Февраль 28, 2011, 10:42 »

Ы! GNU GPL Улыбающийся
Еще ни разу не брал денег за свои проги - характер дурацкий. Грустный
И  не надо начинать Улыбающийся
Прошу привести пример самого простейшего приложения, где происходит взаимодействие с GUI из вторичного потока. Заранее благодарен.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #8 : Февраль 28, 2011, 10:50 »

За свои проги денег не беру. За чужие беру.
Нельзя работать с ГУИ из другого потока.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
fuCtor
Гость
« Ответ #9 : Февраль 28, 2011, 17:03 »

Например вот так, подробнее по параметрам и тд в документции можно прочитать.
QMetaObject::invokeMethod(obj, "click", Qt::QueuedConnection);
Записан
jacuba
Гость
« Ответ #10 : Март 01, 2011, 09:48 »

Всем большое спасибо, задача решена.

Код:
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <QApplication>
#include <QPushButton>
#include <QWidget>
#include <QStyle>
#include <QVBoxLayout>
#include <QMetaObject>
#include <QLabel>

QVBoxLayout *vb;
QLabel *lab;
QPushButton *button1;
QPushButton *button2;
QPushButton *button3;

void * ColorButton12(void * arg)
{
    QMetaObject::invokeMethod(button1, "setStyleSheet" ,Q_ARG(QString, " background-color: green ;border-radius: 8px; border-color: black; border-style: outset; border-width: 2px"));
    QMetaObject::invokeMethod(button2, "setStyleSheet" ,Q_ARG(QString, " background-color: yellow ;border-radius: 8px; border-color: black; border-style: outset; border-width: 2px"));
}
void * ColorButton23(void * arg)
{
    QMetaObject::invokeMethod(button2, "setStyleSheet" ,Q_ARG(QString, " background-color: red ;border-radius: 8px; border-color: black; border-style: outset; border-width: 2px"));
    QMetaObject::invokeMethod(button3, "setStyleSheet" ,Q_ARG(QString, " background-color: gray ;border-radius: 8px; border-color: black; border-style: outset; border-width: 2px"));
}

int main(int argc, char *argv[])
{
    pthread_t thread1, thread2;

    QApplication app(argc, argv);
    QWidget *window = new QWidget;
    vb = new QVBoxLayout(window);
    window->resize(200, 120);

    lab = new QLabel;
    lab->setText("label1");

    button1 = new QPushButton("Button1", window);
    button2 = new QPushButton("Button2", window);
    button3 = new QPushButton("Button3", window);

    vb->addWidget(button1);
    vb->addWidget(button2);
    vb->addWidget(button3);
    vb->addWidget(lab);
    window->setLayout(vb);
    window->show();

    pthread_create(&thread1, NULL, ColorButton12, NULL);
    pthread_join(thread1, NULL);
    pthread_create(&thread2, NULL, ColorButton23, NULL);
    sleep(1);
    return app.exec();
}
« Последнее редактирование: Март 01, 2011, 11:17 от jacuba » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.044 секунд. Запросов: 23.