Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: jacuba от Февраль 25, 2011, 11:53



Название: POSIX-потоки и QT-кнопки
Отправлено: 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 дня.



Название: Re: POSIX-потоки и QT-кнопки
Отправлено: bmw от Февраль 25, 2011, 16:27
Сомневаюсь что у вас так получится. Вообще подразумаевается что обращаться к интерфейсу можно только из основного потока.
Я так думаю что и на POSIX потоки это распространяется. Как вариант генерируйте в своём втором потоке сигнал, на который в основном потоке и будет реагировать кнопка.


Название: Re: POSIX-потоки и QT-кнопки
Отправлено: Fat-Zer от Февраль 25, 2011, 16:46
весь интерфейс должен быть в одном потоке... и нафига ж тут POSIX потоки пользовать Qt'шные ведь намного симпотичней выглядят!?


Название: Re: POSIX-потоки и QT-кнопки
Отправлено: jacuba от Февраль 28, 2011, 08:17
bmw, не мог бы ты показать, как именно мне сгенерировать этот сигнал. Заранее благодарен.


Название: Re: POSIX-потоки и QT-кнопки
Отправлено: kuzulis от Февраль 28, 2011, 09:13
2 jacuba,

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

ЗЫ: И что ж всем так лень почитать то, а?
Не хочу учиться - а хочу жениться (с) ? ;)


Название: Re: POSIX-потоки и QT-кнопки
Отправлено: jacuba от Февраль 28, 2011, 10:20
Прочитать пару книжек и самостоятельно разобраться с вопросом - это конечно очень хорошо и правильно.

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


Название: Re: POSIX-потоки и QT-кнопки
Отправлено: Пантер от Февраль 28, 2011, 10:22
$100


Название: Re: POSIX-потоки и QT-кнопки
Отправлено: jacuba от Февраль 28, 2011, 10:42
Ы! GNU GPL :)
Еще ни разу не брал денег за свои проги - характер дурацкий. :(
И  не надо начинать :)
Прошу привести пример самого простейшего приложения, где происходит взаимодействие с GUI из вторичного потока. Заранее благодарен.


Название: Re: POSIX-потоки и QT-кнопки
Отправлено: Пантер от Февраль 28, 2011, 10:50
За свои проги денег не беру. За чужие беру.
Нельзя работать с ГУИ из другого потока.


Название: Re: POSIX-потоки и QT-кнопки
Отправлено: fuCtor от Февраль 28, 2011, 17:03
Например вот так, подробнее по параметрам и тд в документции можно прочитать.
QMetaObject::invokeMethod(obj, "click", Qt::QueuedConnection);


Название: Re: POSIX-потоки и QT-кнопки
Отправлено: jacuba от Март 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();
}