QT

Модератор: Модераторы разделов

Ответить
Аватара пользователя
nuclear17
Сообщения: 117
ОС: linux/mac/win
Контактная информация:

QT

Сообщение nuclear17 »

Как отловить нажатие на QPushButton, нарисованную через дизайнер?
пробывал так:

Код: Выделить всё

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    test2qt w;
    w.show();
    Ui_test2qtClass Mooo;
    QPushButton *button =Mooo.pushButton;
    QObject::connect(button, SIGNAL(clicked()),
    &a, SLOT(quit()));
    return a.exec();
}

вылетает прога.
Спасибо сказали:
Skala
Сообщения: 241
ОС: Gentoo

Re: QT

Сообщение Skala »

>Как отловить нажатие на QPushButton, нарисованную через дизайнер?

Так же, как и обычную кнопку: поставить слот для сигнала. Сперва объявляешь слот (названия ф-ции взяты из другого проекта):
# cat dialog.h
...
private slots:
void on_AddItem_Clicked();
...

Затем в дизайнере (мы же про designer говорим?) переключаешься на редактирование сигналов/слотов и для кнопки задаешь такое соединение:

QObject::connect(AddItem, SIGNAL(clicked()), Dialog, SLOT(on_AddItem_Clicked()));

Dialog - Это форма, поэтому соединяешь кнопку с формой.
Спасибо за внимание.
Спасибо сказали:
Аватара пользователя
nuclear17
Сообщения: 117
ОС: linux/mac/win
Контактная информация:

Re: QT

Сообщение nuclear17 »

Написал так:

Код: Выделить всё

class Ui_test2qtClass
{
private slots:
 void testsig1()
 {
     MessageBox(NULL, (WCHAR *)"test", (WCHAR *)"test", MB_OK|MB_ICONSTOP);
 }
public:
    QPushButton *pushButton;

    void setupUi(QWidget *test2qtClass)
    {
    if (test2qtClass->objectName().isEmpty())
        test2qtClass->setObjectName(QString::fromUtf8("test2qtClass"));
    test2qtClass->resize(400, 241);
    pushButton = new QPushButton(test2qtClass);
    pushButton->setObjectName(QString::fromUtf8("pushButton"));
    pushButton->setGeometry(QRect(10, 30, 75, 24));

    retranslateUi(test2qtClass);
    QObject::connect(pushButton, SIGNAL(clicked(bool)), test2qtClass, SLOT(testsig1()));

    QMetaObject::connectSlotsByName(test2qtClass);
    } // setupUi

    void retranslateUi(QWidget *test2qtClass)
    {
    test2qtClass->setWindowTitle(QApplication::translate("test2qtClass", "test2qt", 0, QApplication::UnicodeUTF8));
    pushButton->setText(QApplication::translate("test2qtClass", "PushButton", 0, QApplication::UnicodeUTF8));
    Q_UNUSED(test2qtClass);
    } // retranslateUi

};


нет реакции при нажатии на кнопку
Спасибо сказали:
Skala
Сообщения: 241
ОС: Gentoo

Re: QT

Сообщение Skala »

Другой вариант, более простой:
1. Объявляешь слот для нажатия кнопки:
void on_CancelButton_clicked();
//Где это CancelButton ID кнопки, _clicked обязательное обозначение клика
2. обрабатываешь нажатие:
void Dialog::on_CancelButton_clicked()
{
/* обработка */
}
Где Dialog имя класса окна.
Спасибо за внимание.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: QT

Сообщение NickLion »

nuclear17 может выложите исходник полностью? Создаю Qt проект, QPushButton, цепляю к сигналу слот - все работает.
И еще:

Код: Выделить всё

     MessageBox(NULL, (WCHAR *)"test", (WCHAR *)"test", MB_OK|MB_ICONSTOP);
Не стоит так делать :) Надо

Код: Выделить всё

     MessageBox(NULL, L"test", L"test", MB_OK|MB_ICONSTOP);
Спасибо сказали:
Аватара пользователя
GMar
Сообщения: 237
Статус: Будущий математик
ОС: Kubuntu,Ubuntu(UNR) 10.04

Re: QT

Сообщение GMar »

QtCreator вам в руки.. Все само собой решится (за счет автодополнения и прочих)
Спасибо сказали:
Аватара пользователя
reich
Сообщения: 8
ОС: Debian
Контактная информация:

Re: QT

Сообщение reich »

Если в ui_MyForm.h кнопка обьявленя как

Код: Выделить всё

QPuchButton *pushButton = new QPushButton;

то есть обькет кнопки имеет имя pushButton и Ваша форма не является классом-наследником от ui класса, то в любом из методов делаем так:

Код: Выделить всё

connect( ui.pushButton, SIGNAL( clicked() ), this, SLOT( mySlot() ) );

где mySlot() - это [например]

Код: Выделить всё

public slots:
    void mySlot(){ qDebug() << "pushButton clicked!!!"; }
Спасибо сказали:
ploop
Сообщения: 40

Re: QT

Сообщение ploop »

Не буду новую тему создавать, эта вроде подходит. У меня есть пара вопросов по Qt.
1. В QtCreator создаю gui приложение, в дизайнере делаю форму, допустим, с одной кнопкой. Связываю так: в класс формы, созданной автоматом, добавляю новый слот:

Код: Выделить всё

private slots: // Это в mainwindow.h
    void buttonClick();
// и реализацию в mainwindow.cpp
void MainWindow::buttonClick()
{
    this->close() // к примеру...
}

Далее связываю в конструкторе главной формы:

Код: Выделить всё

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);
connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(buttonClick()));
}

Всё работает. Собственно вопрос: правильно ли я делаю? В смысле, если в приложении будет много форм, в дальнейшем, чтоб что-то добавить/убрать проблем не будет? Или есть другой, более правильный подход?

Второй вопрос по диалогам. Ну, к примеру, я хочу по нажатию кнопки вызвать QFileDialog, вроде проблем нет:

Код: Выделить всё

QFileDialog *openDialog = new QFileDialog(this); // если родителя не указать, он существует "сам по себе"
openDialog.show();

В этом случае создаётся новый объект, но удалится ли он после закрытия? Просто меня смутило вот что:

Код: Выделить всё

QFileDialog openDialog(this);
    openDialog.show();

В этом случае деструктор явно вызывается, т.к. диалог создаётся, показывается, и тут же исчезает. А в первом случае - не понятно, если я 10 раз его вызову и закрою, не останется ли 10 "потерянных" копий объекта в памяти?
Спасибо сказали:
cm9x4
Сообщения: 33
ОС: OpenSuse 11.1

Re: QT

Сообщение cm9x4 »

Столкнулся с проблемой кодировок при выводе Header'a в QTableView. Выводятся кракозябры. Не могу понять, что и где изменить.

Имеется класс

Код: Выделить всё

class TableModel : public QAbstractTableModel
{
private:
    QList<QString> m_columns;

    QList< QList<QString> > m_rows;

public:
    TableModel(QObject *parent=0);

    int rowCount(const QModelIndex &parent) const;

    int columnCount(const QModelIndex &parent) const;

    QVariant data(const QModelIndex &index, int role) const;

    QVariant headerData(int section, Qt::Orientation orientation, int role) const;

    void AddColumn(QString key);
};

Для вывода header'a перегружена функция

Код: Выделить всё

//-----------------------------------------------------------------------------
 QVariant TableModel::headerData(int section, Qt::Orientation orientation, int role) const
 {
     if (role != Qt::DisplayRole)
     {
         return QVariant();
     }

     if (orientation == Qt::Horizontal && section >= 0 && section < m_columns.count())
     {
         return m_columns.at(section);
     }

     return QVariant();
 }


Инициализация header'a производится так

Код: Выделить всё

void MainWin::InitData()
{
    m_varModel.AddColumn("Название");

    m_varModel.AddColumn("Тип");

    m_varModel.AddColumn("Значение");

    this->m_ui->varTableView->setModel(&m_varModel);
}


В итоге получаем кракозябры в заголовках колонок.

Используется WinXpsp2, Qt 4.5.2, QtCreator 1.2.1
В настройках текстового редактора выставлена кодировка UTF-8. Что еще нужно поправить?
Спасибо сказали:
alfss
Сообщения: 262

Re: QT

Сообщение alfss »

начинаем осваивать linguist
Спасибо сказали:
ploop
Сообщения: 40

Re: QT

Сообщение ploop »

начинаем осваивать linguist
А без него никак в коде не задать строку?
Меня тоже этот вопрос волнует:

Код: Выделить всё

ui->pushButton->setText(QString("Проверка"));
ui->pushButton->setText("Проверка");

Что в windows, что в linux - не работает, кракозябры...
Спасибо сказали:
alfss
Сообщения: 262

Re: QT

Сообщение alfss »

QString qStr = QString::fromUtf8("Привет!")

а вообще плохо не использовать linguist
Спасибо сказали:
ploop
Сообщения: 40

Re: QT

Сообщение ploop »

а вообще плохо не использовать linguist
Чтоб научиться его использовать, нужно хотя бы одно приложение написать :)
QString::fromUtf8 - не помогло, но логическими заключениями пришел к QString::fromLocal8Bit - в windows работает.
Собственно еще одна проблема. Исходники в win-версии сохраняются в cp1251, в linux - в utf8. Отсюда, думаю, и проблемы. В настройках редактора кодировку не нашел...

----
Нашел. Её почему-то в меню "Правка" засунули, т.е. для каждого файла отдельно. А вот по-умолчанию как настроить не нашел :(
Спасибо сказали:
alfss
Сообщения: 262

Re: QT

Сообщение alfss »

под вяндой низнай) а в linux
emacs (current-language-environment "UTF-8")
vim setf utf8
Спасибо сказали:
ploop
Сообщения: 40

Re: QT

Сообщение ploop »

под вяндой низнай
И там и там по умолчанию редактор в QtCreator берёт системную кодировку. А они, как известно, разные.
Собственно, уже не проблема. Главное разобрались. Просто нужно выбрать, в какой собираешься работать, и все файлы пересохранить в ней. А далее в тексте - QString::fromКодировка и всё.

Просто я один и тот же проект под win и под linux редактирую одновременно (на работе и дома).

А вообще мне ихний редактор не очень нравится. Уж какой-нибудь Kate и то лучше выглядит. Но автодополнение и "спеллчекер" на код очень помогают...
Спасибо сказали:
Аватара пользователя
Crazy
Сообщения: 862
Статус: Адепт Дзен.
ОС: Mint, Win7.

Re: QT

Сообщение Crazy »

QObject::tr("бла бла бла")
QObject::trUtf8("бла бла бла");

Desipere in loco
Спасибо сказали:
ploop
Сообщения: 40

Re: QT

Сообщение ploop »

Господа, ну а как быть с диалогами в моём вопросе выше? Прогнал отладчиком - как я и думал, после закрытия окна диалога объект не прекращает своё существование (деструктор не выполняется). А вот после закрытия главной формы, деструктор вызывается столько раз, сколько был открыт диалог. Еще раз код, как вызываю диалог:

Код: Выделить всё

    dialog_form *dialog = new dialog_form(this); // this - главная форма
    dialog->show();
Спасибо сказали:
alfss
Сообщения: 262

Re: QT

Сообщение alfss »

MyDialog *d;
d = new MyDialog();
d->exec();
delete d;
Спасибо сказали:
ploop
Сообщения: 40

Re: QT

Сообщение ploop »

Спасибо, про метод exec() не знал. Это то, что нужно.
Спасибо сказали:
ploop
Сообщения: 40

Re: QT

Сообщение ploop »

А можно еще один вопрос (чтоб в тонкостях разобраться)?
чем это:
MyDialog *d;
d = new MyDialog();
d->exec();
delete d;

отличается от этого:
MyDialog d;
d.exec();

Во втором случае тоже объект нормально создаётся и уничтожается автоматически. Или тут это не имеет значения?
Я хорошо понимаю, как оба способа работают, вопрос собственно в том, где и какой способ правильней применять...
Спасибо сказали:
alfss
Сообщения: 262

Re: QT

Сообщение alfss »

выбирать то как вам нравится
во втором варианте вы полгаетесь на реализацию в QT .
в 1 все в ручную.
Спасибо сказали:
cm9x4
Сообщения: 33
ОС: OpenSuse 11.1

Re: QT

Сообщение cm9x4 »

Продолжаю изучение QT. Пытаюсь создать синглетон для доступа к БД. Но не могу использовать статичную строку в классе.

Код: Выделить всё

#include<QtCore>

#ifndef DATAMANAGER_H
#define DATAMANAGER_H

class DataManager
{
    public:
        static bool TestConnection(QString dataSource, QString dataBase, QString user, QString password);
    private:
        static QString m_connStr;

        DataManager();
};

#endif // DATAMANAGER_H

Код: Выделить всё

#include<QtSql>

#include "datamanager.h"

//------------------------------------------------------------------------------
DataManager::DataManager()
{
}

//------------------------------------------------------------------------------
bool DataManager::TestConnection(QString dataSource, QString dataBase, QString user, QString password)
{
    QString connStr = "Data Source=myServerAddress;Initial Catalog=myDataBase;User Id=myUsername;Password=myPassword;";

    QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");

    db.setDatabaseName(connStr);

    if (!db.open())
    {
         qDebug("Error occured in connection to database");

         return false;
    }

    qDebug("connected to database");

    db.close();

    //  сохраняем параметры подключения
    DataManager::m_connStr = connStr;

    return true;
}

получаю ошибку

Код: Выделить всё

D:/Proj/QtMsSql/QtMsSql/datamanager.cpp:31: undefined reference to `DataManager::m_connStr'
:-1: error: collect2: ld returned 1 exit status

не могу понять, что не так.
Пробовал
QString *m_connStr;
А затем инициализировать в коде - без разницы.
Спасибо сказали:
Ramol
Сообщения: 44
ОС: Debian

Re: QT

Сообщение Ramol »

Добав в сpp файл QString DataManager::m_connStr;
И еще я б добавил приватный конструктор копирования и оператор присвоения
Спасибо сказали:
cm9x4
Сообщения: 33
ОС: OpenSuse 11.1

Re: QT

Сообщение cm9x4 »

Ramol писал(а):
27.08.2009 17:47
Добав в сpp файл QString DataManager::m_connStr;
И еще я б добавил приватный конструктор копирования и оператор присвоения

спасибо за помощь. Как оказывается совсем забыл c++ :(
Спасибо сказали:
Obscurus
Сообщения: 171

Re: QT

Сообщение Obscurus »

Чтобы новых не плодить напишу сюда.
В одной Qt-программе должно по некоторому событию открываться инструментальное окно. Оно является как бы второстепенным и должно закрываться одновременно с главным. Но при этом оно полноценное окно с меню и тулбарами, так что QDialog здесь не подойдёт. Я решил сделать так:

Код: Выделить всё

w = new QMainWindow(this);
w->show();

Окно вылезает как положено, но оно всегда остаётся ПОВЕРХ родительского, даже если теряет фокус. Чтобы увидеть основное окно приходится отодвигать его куда-то в сторону. Как бы это исправить?
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: QT

Сообщение NickLion »

Не нужно связывать его с this тогда. Сделайте так:

Код: Выделить всё

    QMainWindow* w = new QMainWindow();
    w->setWindowFlags(Qt::SubWindow);
    w->show();
Спасибо сказали:
Obscurus
Сообщения: 171

Re: QT

Сообщение Obscurus »

Не нужно связывать его с this

Я пробовал, но там вообще чудеса получаются. После закрытия главного окна всплывающее остаётся и приложение не завершается. Или флаг SubWindow должен всё исправить?
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: QT

Сообщение NickLion »

Да.
Спасибо сказали:
Obscurus
Сообщения: 171

Re: QT

Сообщение Obscurus »

Помогло, спасибо.
Спасибо сказали:
Ответить