crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

История благодарностей участнику JuryS1806 ::: Спасибо сказали: 9 раз(а)
Дата поста: В теме: За сообщение: Спасибо сказали:
1.2.2011, 2:28 Делегат для конкретной ячейки в QTableView
Еще массу наработок сделал. Если кому нужно, пишите.

И такой вопрос. А как все таки в комбобокс засунуть таблицу ? И еще я при работе в Linux получаю комбо бокс, у которого размер выпадающего списка соответствует размеру содержимого текста, а в Windows ставятся троеточия по середине текста.

Решил проблему под Windows приблизительно так:

    int w = 0, w1;
    QFontMetrics fm(editor->font());

        QList< QPair<int,QString> >::const_iterator it=aValues.begin();
        while (it != aValues.end())
            {
                const QPair <int,QString> aPair = *it;
                editor->addItem(aPair.second);
                w1 = fm.width(aPair.second);
                if (w1 > w) w = w1;
                ++it;
            }
        if (editor->width() < w)
            editor->view()->setFixedWidth(w+25);

Но все таки думаю может быть фирменное решение этого вопроса есть. И ведь в Linux почему-то на автомате списки нормально отображаются, значит в винде их как-то залочили ????
alexx83, dragomir,
2.2.2010, 18:17 кнопки-иконки
Думаю только может помочь что троли прописали. только style sheets
Кстати в примерах mainwindow есть пример с рисованием виджетов
там left.jpg, border.jpg как раз определяют style sheets. /название какое-то дерьмо у тролей 8) /

QPushButton {
border: 2px solid #8f8f91;
border-radius: 6px;
background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
stop: 0 #f6f7fa, stop: 1 #dadbde);
min-width: 80px;
}

QPushButton:pressed {
background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
stop: 0 #dadbde, stop: 1 #f6f7fa);
}

QPushButton:flat {
border: none; /* no border for a flat push button */
}

QPushButton:default {
border-color: navy; /* make the default button prominent */
}
breeve,
29.1.2010, 0:34 Добавление произвольного ресурса в run time
Я такую фишку видел у Макса Шлее или у Жасмина Бланшета. И пример такой программы тоже.
Апликация 2 Кб, а картинки раздельно . сейчас найду и притащу пример.

Вот этот пример программы. В корне лежит картинка img.jpg но ее можно и по ссылке открыть .

/* ======================================================================
**  main.cpp
** ======================================================================
**
** ======================================================================
**  Copyright (c) 2007 by Max Schlee
** ======================================================================
*/

#include <QtGui>

// ----------------------------------------------------------------------
int main(int argc, char** argv)
{
    QApplication app(argc, argv);

    QLabel lbl("<H1><CENTER>QLabel - HTML Demo</CENTER></H1>"
               "<H2><CENTER>Image</CENTER><H2>"
               "<CENTER><IMG BORDER=\"0\" SRC=\"img.jpg\"></CENTER>"
               "<H2><CENTER>List</CENTER><H2>"
               "<OL><LI>One</LI>"
               "    <LI>Two</LI>"
               "    <LI>Three</LI>"
               "</OL>"
               "<H2><CENTER>Font Style</CENTER><H2>"
               "<CENTER><FONT COLOR=RED>"
               "    <B>Bold</B>, <I>Italic</I>, <U>Underline</U>"
               "</FONT></CENTER>"
               "<H2><CENTER>Table</CENTER></H2>"
               "<CENTER> <TABLE>"
               "    <TR BGCOLOR=#ff00ff>"
               "        <TD>1,1</TD><TD>1,2</TD><TD>1,3</TD><TD>1,4</TD>"
               "    </TR>"
               "    <TR BGCOLOR=YELLOW>"
               "        <TD>2,1</TD><TD>2,2</TD><TD>2,3</TD><TD>2,4</TD>"
               "    </TR>"
               "    <TR BGCOLOR=#00f000>"
               "        <TD>3,1</TD><TD>3,2</TD><TD>3,3</TD><TD>3,4</TD>"
               "    </TR>"
               "</TABLE> </CENTER>"
              );

    lbl.show();

    return app.exec();
}


P.S. Не забываем про спасибо.
yust52,
12.12.2009, 1:48 QT + скрипты
Всем доброго времени суток ! Недавно разобрался как работают скрипты Qt (поддержка их начиная с версии Qt 4.3 и выше)

Так вот:
1. В файл проекта добавляю строку QT += script
2. В заголовке нужного модуля добаляю

#include <QScriptEngine>

private:
          QScriptEngine MacroEngine;


3. В теле программы
#include <QtScript>
//и уже в функции выполнения макроса, например при нажатии кнопки:
void MacroAnalizer::MacroOpen()
{

    MainWindow* application = MainWindow::getApplication();

    MacroEngine.globalObject().setProperty("m",MacroEngine.newQObject(this));
    MacroEngine.globalObject().setProperty("toUnicode",MacroEngine.newFunction(toUnicode));

        QString DirToLoad = QDir::currentPath()+"/Macros";
    QString fileName
        = QFileDialog::getOpenFileName(application, trUtf8("Выполнить макрос..."),DirToLoad,trUtf8( "Файлы макросов (*.smac)"));
    if (fileName.isEmpty())
        return;
    QFile file(fileName);

    if (file.open(QFile::ReadOnly)) {

        QScriptValue result =
         MacroEngine.evaluate(QLatin1String(file.readAll()));
    if (result.isError()) {
        QMessageBox::critical(application,
                              trUtf8("Ошибка выполнения"),
                              result.toString(),
                             QMessageBox::Yes
                             );
    }

   }
else
{
        QString msg = trUtf8("Ошибка при чтении %1\n%2")
                        .arg(fileName)
                        .arg(file.errorString());
        QMessageBox::warning(application, trUtf8("Ошибка"), msg);
        return;
}
}


4. Для использования русских букв также добавляю в теле программы отдельную функцию, но не декларирую ее в загаловке:

 QScriptValue  toUnicode(QScriptContext *context, QScriptEngine *engine)
{
        QString s = context->argument(0).toString();
        return  QScriptValue (engine, QString::fromUtf8(s.toAscii().data()));
}

5. После этого все функции, которые описаны в public slots будут доступны в скриптах.
И еще одна функция: toUnicode.

Пример скрипта:

//Пробный макрос
m.ver();
m.about();
m.line(0,0,0,100,100,100);
m.point(200,200,300);
m.circle("XY",0,0,0,200);
var s = toUnicode("Тестовый макрос");
m.history(s);

Не забываем говорить спасибо, если кому пригодился данный мануал.
shard, Svet, ViGOur,
14.11.2009, 23:44 Макро Анализатор для OpenCascade
ВСЕМ ДОБРОГО ВРЕМЕНИ СУТОК ! вот что получилось у меня с анализатором команд, может кому пригодится. два дня тестировал, работает как часы.
Может быть у кого будут мысли по оптимизации такого кода. Он конечно колхозный, но очень четко работает !


Раскрывающийся текст
#include "AnalizeMacro.h"
#include "mainwindow.h"
#include <DocumentCommon.h>

MacroAnalizer::MacroAnalizer(QString Text)
{
        QString Tested1; //текст после отсечения пояснений
        QString Tested2; //тестируемые параметры команды
        QString Fixed; //фиксированная часть команды
        QString arg1;
        QString arg2;
        QString arg3;
        QString arg4;
        QString arg5;
        QString arg6;
        QString arg7;
        QString arg8;
        QString arg9;
        QString arg10;

//Базовая обработка строки
        Text.toLower(); //нижний регистр строки
//        Text=Text.trimmed(); //почистить непечатаемые символы, также убрать пробелы в начале и в конце текста
        Text=Text.simplified(); //заменить повторяющиеся пробелы одинарным!

//ПЕРВЫЙ ПРОХОД. ПЫТАЮСЬ НАЙТИ ПОЯСНЕНИЯ. ИГНОРИРУЮ ПРАВУЮ ЧАСТЬ.

        QStringList TestForIgn = Text.split("//");

if (TestForIgn.isEmpty())  // Если не обнаружился знак начала пояснения
{
    Tested1 = Text;     //тогда продолжаю тестировать
}
if (!TestForIgn.isEmpty())  // Если обнаружился знак начала пояснения
{
    Tested1 = TestForIgn.first();     //тогда тестирую левую часть выражения
}
Tested1=Tested1.simplified();
//ВТОРОЙ ПРОХОД. РАЗДЕЛЯЮ ОСНОВНУЮ КОМАНДУ ОТ ПАРАМЕТРОВ КОМАНДЫ.

        QStringList TestForSpace = Tested1.split(QRegExp("\\s+"));

if (TestForSpace.isEmpty())  // Если не обнаруживаю ни одного пробела в команде
{
    Fixed = Tested1;     //это и есть фиксированная часть команды
}
if (!TestForSpace.isEmpty())  // Если обнаружился пробел, тогда работаю с левой и правой частью
{
    Fixed = TestForSpace.first();     //фиксированная часть
QStringList ::const_iterator i;
for (i = TestForSpace.constBegin()+1; i != TestForSpace.constEnd(); ++i)  Tested2 += " " + (*i);
}

Fixed=Fixed.simplified();


if ((!Fixed.isEmpty())&&(!Tested2.isEmpty()))
{
        addNewHistrory(trUtf8("Команда: ")+Fixed+trUtf8(". Параметры: ")+Tested2);
}
if ((!Fixed.isEmpty())&&(Tested2.isEmpty()))
{
        addNewHistrory(trUtf8("Команда: ")+Fixed);
}

//ОТРАБАТЫВАЮ ПАРАМЕТРЫ КОМАНДЫ
if (!Tested2.isNull()) // ЕСЛИ У КОМАНДЫ ЕСТЬ ПАРАМЕТРЫ
{

{ Tested2=Tested2.simplified(); }
        QStringList TestArgForSpace = Tested2.split(QRegExp("\\s+"));

if (!TestArgForSpace.isEmpty())  // Если обнаружился пробел, тогда разделяю параметры на части
{
    for (int i = 0; i < TestArgForSpace.size(); ++i)
{
        if (i==0) { arg1=TestArgForSpace.at(0); }
        if (i==1) { arg2=TestArgForSpace.at(1); }
        if (i==2) { arg3=TestArgForSpace.at(2); }
        if (i==3) { arg4=TestArgForSpace.at(3); }
        if (i==4) { arg5=TestArgForSpace.at(4); }
        if (i==5) { arg6=TestArgForSpace.at(5); }
        if (i==6) { arg7=TestArgForSpace.at(6); }
        if (i==7) { arg8=TestArgForSpace.at(7); }
        if (i==8) { arg9=TestArgForSpace.at(8); }
        if (i==9) { arg10=TestArgForSpace.at(9); }
        if (i>9) { addNewHistrory(trUtf8("Количество параметров команды превышает 10."
                                          "Обратитесь к разработчику системы для увеличения числа параметров.")); }
}

}

if (arg2.isNull()) // Аргумент 2 пустой, возможно запись из одного аргумента, разделенного запятыми
{
        QStringList TestArgForZP = Tested2.split(","); //разбиваю строку по запятым
            if (TestArgForZP.isEmpty()) //если ничего не разбилось
        {
                arg1=Tested2;
        }
            if (!TestArgForZP.isEmpty()) //нашел запятые и разбил на множество аргументов
        {
     for (int i = 0; i < TestArgForZP.size(); ++i)
            {
                if (i==0) { arg1=TestArgForZP.at(0); }
                if (i==1) { arg2=TestArgForZP.at(1); }
                if (i==2) { arg3=TestArgForZP.at(2); }
                if (i==3) { arg4=TestArgForZP.at(3); }
                if (i==4) { arg5=TestArgForZP.at(4); }
                if (i==5) { arg6=TestArgForZP.at(5); }
                if (i==6) { arg7=TestArgForZP.at(6); }
                if (i==7) { arg8=TestArgForZP.at(7); }
                if (i==8) { arg9=TestArgForZP.at(8); }
                if (i==9) { arg10=TestArgForZP.at(9); }
                if (i>9) { addNewHistrory(trUtf8("Количество параметров команды превышает 10."
                                                  "Обратитесь к разработчику системы для увеличения числа параметров.")); }
            }
        }
    }
}

//ПРОВЕРКА !СНЕСТИ ПОТОМ
       addNewHistrory(trUtf8("Арг1: ")+arg1+trUtf8(" Арг2: ")+arg2+trUtf8(" Арг3: ")+arg3+trUtf8(" Арг4: ")+
       arg4+trUtf8(" Арг5: ")+arg5+trUtf8(" Арг6: ")+arg6+trUtf8(" Арг7: ")+arg7+trUtf8(" Арг8: ")+
       arg8+trUtf8(" Арг9: ")+arg9+trUtf8(" Арг10: ")+arg10);
//ПРОВЕРКА !СНЕСТИ ПОТОМ

//        if (Text==tr("new")) { MacroAnalizer::createNewDoc(); }
//        if (Text==trUtf8("новый")) { MacroAnalizer::createNewDoc(); }


}


void MacroAnalizer::createNewDoc()
{
    MainWindow* application = MainWindow::getApplication();
    int Numbertest=MainWindow::getDocNum();
//    DocumentCommon* aDoc = new DocumentCommon( ++Numbertest, application );
    DocumentCommon( ++Numbertest, application );
    MainWindow::addNewDocNum();
    addNewHistrory(trUtf8("Результат: Создан новый чертеж. Вид по умолчанию: Аксонометрия"));
}

void MacroAnalizer::addNewHistrory(QString HisText)
{
    MainWindow::addNewHistoryText(HisText);
}


Теперь можно вводить команды:
линия 1231 112 121 // то что будет в пояснении игнорируется
line 123,123,123 // пробелы лишние стираются
LiNe 120 123 124 // исправляется регистр букв
ЛиниЯ 1231 1231 1231 // различие запятых и полностью рабочий русский язык ввода команд

ВООБЩЕМ, мне лично нравится, буду рад критике
Litkevich Yuriy,
23.10.2009, 20:44 Плавающие QDockWidget.
// Вот собственно две функции, которые через диалоговые окна открытия и сохранения файлов сохраняют
// лэйаут и геометрию всех виджетов. Проверено в M$ Windows и Linux .

void MainWindow::savePanels()
{
    QString DirToSaveAs = QDir::homePath();
    QString fileName
        = QFileDialog::getSaveFileName(this, trUtf8("Сохранить расположение панелей как..."),DirToSaveAs,trUtf8( "Параметры панелей (*.pan)"));
    if (fileName.isEmpty())
        return;
    QFile file(QString(fileName+".pan"));
    if (!file.open(QFile::WriteOnly)) {
        QString msg = trUtf8("Ошибка при открытии файла %1\n%2")
                        .arg(fileName)
                        .arg(file.errorString());
        QMessageBox::warning(this, trUtf8("Ошибка"), msg);
        return;
    }

    QByteArray geo_data = saveGeometry();
    QByteArray layout_data = saveState();

    bool ok = file.putChar((uchar)geo_data.size());
    if (ok)
        ok = file.write(geo_data) == geo_data.size();
    if (ok)
        ok = file.write(layout_data) == layout_data.size();

    if (!ok) {
        QString msg = trUtf8("Ошибка записи в %1\n%2")
                        .arg(fileName)
                        .arg(file.errorString());
        QMessageBox::warning(this, trUtf8("Ошибка"), msg);
        return;
    }
}

void MainWindow::loadPanels()
{
    QString fileName
        = QFileDialog::getOpenFileName(this, trUtf8("Загрузить расположение панелей..."),("/"),trUtf8( "Параметры панелей (*.pan)"));
    if (fileName.isEmpty())
        return;
    QFile file(fileName);
    if (!file.open(QFile::ReadOnly)) {
        QString msg = trUtf8("Ошибка при чтении %1\n%2")
                        .arg(fileName)
                        .arg(file.errorString());
        QMessageBox::warning(this, trUtf8("Ошибка"), msg);
        return;
    }

    uchar geo_size;
    QByteArray geo_data;
    QByteArray layout_data;

    bool ok = file.getChar((char*)&geo_size);
    if (ok) {
        geo_data = file.read(geo_size);
        ok = geo_data.size() == geo_size;
    }
    if (ok) {
        layout_data = file.readAll();
        ok = layout_data.size() > 0;
    }

    if (ok)
        ok = restoreGeometry(geo_data);
    if (ok)
        ok = restoreState(layout_data);

    if (!ok) {
        QString msg = trUtf8("Ошибка при чтении %1")
                        .arg(fileName);
        QMessageBox::warning(this, trUtf8("Ошибка"), msg);
        return;
    }
}
NordWest,

RSS Текстовая версия Сейчас: 29.3.2024, 13:56